วิธีการเขียน Log เพื่อตรวจสอบการทำงาน

ไปเจอบทความเรื่องการเขียน log อ่านแล้วชอบ เลยอยากเอามาฝากครับ ยิ่งทำงานด้าน data engineering หรือพัฒนา data platform ยิ่งมีความจำเป็นต้องเขียน log เลย เพื่อให้เราสามารถที่จะตรวจสอบการทำงานของระบบเราได้

Log after, not before

เวลาเขียนก็ให้เขียนหลังจากที่เราเรียกฟังก์ชั่น

// don't do that
log.info("Making request to REST API")
restClient.makeRequest()
 
// do that
restClient.makeRequest()
log.info("Made request to REST API")

จะได้รู้ว่าฟังก์ชั่นเราทำงานสำเร็จหรือเปล่า ตรงนี้หลายๆ คนอาจจะชอบเขียนไว้ทั้งก่อนและหลังเลยก็ได้ แต่ไม่ควรจะมีแค่ก่อนเรียกฟังก์ชั่นครับ

Separate parameters and messages

ส่วนนี้ผมชอบมาก และเอาไปทำตามเลย

// don't do that
restClient.makeRequest()
log.info("Made request to {} on REST API.", url)
 
// do that
restClient.makeRequest()
log.info("Made request to REST API. [url={}]", url)

ตรงนี้จะชัดเจนเลยว่าเรามีตัวแปรอะไรบ้างที่อยากจะดูค่า แล้วก็ที่สำคัญคือเราสามารถเอา Grok patterns มาจับค่าต่างๆ ได้ ซึ่งตรงนี้เราจะสามารถนำ log ที่ได้ไปต่อยดอดวิเคราะห์อะไรได้เพิ่มเติม

Distinguish between WARNING and ERROR

ใช้ log level ส่วน WARNING กับ ERROR ให้เป็นประโยชน์

try {
    restClient.makeRequest()
    log.info("Made request to REST API. [url={}]", url)
} catch(e: UnauthorizedException) {
    log.warn("Request to REST API was rejected because user is unauthorized. [url={}, result={}]", url, result)
} catch(e: Exception) {
    log.error("Request to REST API failed. [url={}, exception={}]", url, exception)
}

จากตัวอย่างโค้ดด้านบน ตัว WARNING ก็ประมาณว่าเรายิง API ไปได้นะ แต่มีปัญหาเรื่อง unauthorization ส่วน ERROR นี่คือยิงไปไม่ได้เลย เป็นสิ่งที่เราไม่ได้คาดหวังว่าจะเป็นแบบนั้น

WARNING อาจจะเอาไปใช้แจ้งเรื่อง deprecation ก็ได้นะ

INFO is for business, DEBUG for technology

ตรงนี้ก็ใช้ log level ให้เป็นประโยชน์เช่นกัน INFO เนี่ยใช้บอกเรื่อง business flow ส่วน DEBUG ก็เป็นเรื่องพวก technical ต่างๆ

DEBUG | Saved user to newsletter list. [user="Thomas", email="thomas@tuhrig.de"]
DEBUG | Send welcome mail. [user="Thomas", email="thomas@tuhrig.de"]
INFO  | User registered for newsletter. [user="Thomas", email="thomas@tuhrig.de"]
DEBUG | Started cron job to send newsletter of the day. [subscribers=24332]
INFO  | Newsletter send to user. [user="Thomas"]
INFO  | User unsubscribed from newsletter. [user="Thomas", email="thomas@tuhrig.de"]

ประมาณนี้ ใครมีวิธีการเขียน log แบบไหนแจ่มๆ เอามาเล่าให้อ่านกันบ้างนะ :innocent:

4 Likes

อันนี้ดีมาก

แต่ ถ้าเป็นงาน data pipelines, แล้วใส่ log หลัง operation นี่ร้องไห้นะ เพราะไม่รู้ว่าเริ่มพังตั้งแต่จุดไหน :joy:
วิ่งแต่ละที กินบุฟเฟ่เสร็จอย่างต่ำมื้อนึง :shallow_pan_of_food: