背景:
- 我的項(xiàng)目都使用
filebeat
來采集日志 - 大部分項(xiàng)目都是
Java
項(xiàng)目,直接使用slf4j
來打印日志玉凯,每行日志的開頭都是時(shí)間戳 - 因此在
filebeat
中直接配置一個(gè)匹配時(shí)間戳的正則,就完成了日志分行 - 要用
filebeat
采集elastalert
的日志联贩,并且想復(fù)用原來的正則
所以需要格式化一下elastaler
t的日志格式壮啊,方便我采集。
查看一下代碼撑蒜,elastalert
的日志都用 util.py
中的這個(gè)logger
來打印痊银,如下:
這個(gè)
logger
就是util.py
中的
logging.basicConfig()
elastalert_logger = logging.getLogger('elastalert')
啥都沒設(shè)置呻征,就寫了個(gè)名字elastalert
一張白紙啊茅郎,可以隨意改蜒车!
先點(diǎn)進(jìn)去看一下logging.basicConfig()
的代碼杂数,發(fā)現(xiàn)功能有限疫铜,不能實(shí)現(xiàn)我們需要按天滾動(dòng)日志的需求彻磁,所以我們使用Handler
首先要給他加上時(shí)間戳留凭,為了方便找到日志岁钓,還可以打印是哪個(gè)文件多少行的日志升略,
所以我的日志格式定義為:
log_fmt = '%(asctime)s.%(msecs)03d %(threadName)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
解釋一下:
-
asctime:
時(shí)間戳,%s -
msecs:
毫秒屡限,%03d -
filename:
打印日志的文件名稱品嚣, %s -
line:
打印日志的行號(hào),%d -
levelname:
日志等級(jí)钧大,%s -
message:
日志內(nèi)容翰撑,%s
formater
支持的參數(shù)小計(jì)
-
levelno
打印日志級(jí)別的數(shù)值,%s -
levelname:
打印日志級(jí)別名稱啊央,%s -
pathname:
打印當(dāng)前執(zhí)行程序的路徑眶诈,其實(shí)就是sys.argv[0],%s -
filename:
打印當(dāng)前執(zhí)行程序文件名瓜饥,%s -
funcName:
打印日志的當(dāng)前函數(shù)逝撬,%s -
lineno:
打印日志的當(dāng)前行號(hào),%d -
asctime:
打印日志的時(shí)間乓土,%s -
thread:
打印線程ID宪潮,%d -
threadName:
打印線程名稱溯警,%s -
process:
打印進(jìn)程ID,%d -
message:
打印日志信息坎炼,%s
因?yàn)?code>logging中默認(rèn)的時(shí)間戳是 %Y-%m-%d %H:%M:%S,%f
愧膀,但是我就想要秒%S
和毫秒%f
中間的符號(hào)是點(diǎn).
,不是逗號(hào),
谣光。但是 strftime()
并不支持格式化到毫秒檩淋,所以要把時(shí)間戳asctime
格式化為%Y-%m-%d %H:%M:%S
, 然后拼上點(diǎn).
和msecs
這個(gè)屬性萄金。
接下來蟀悦, 定義時(shí)間戳的格式,然后放入logging.Formatter()
:
date_fmt = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(log_fmt, date_fmt)
寫一個(gè)生成日志文件的handler
# 日志文件
log_file_handler = TimedRotatingFileHandler(
filename='${日志文件路徑}/${日志文件名}.log',
when='M',
interval=2,
backupCount=3)
log_file_handler.suffix = '%Y-%m-%d'
log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.\d{2}:\d{2}$")
log_file_handler.setLevel(logging.INFO)
log_file_handler.setFormatter(formatter)
elastalert_logger.addHandler(log_file_handler)
解釋一下:
-
filename:
就是生成日志文件的文件名 -
when:
觸發(fā)滾動(dòng)的時(shí)間單位 -
interval:
觸發(fā)滾動(dòng)的周期氧敢,如when='M'日戈,interval=2,即每?jī)煞昼姖L動(dòng)一次 -
backupCount:
最大滾動(dòng)文件數(shù) -
suffix:
文件后綴孙乖,滾動(dòng)文件會(huì)在文件名后添加的后綴 -
extMatch:
文件后綴符合的正則浙炼,用于刪除超過backupCount數(shù)目的日志文件
按照上述我的配置,即每2分鐘滾動(dòng)一個(gè)新的日志文件唯袄,最多存在三個(gè)滾動(dòng)文件弯屈。
當(dāng)前正在寫入的文件名稱為${日志文件路徑}/${日志文件名}.log
滾動(dòng)后的文件名稱為${日志文件路徑}/${日志文件名}.log.%Y-%m-%d
再寫一個(gè)控制臺(tái)打印日志的handler
:
# 控制臺(tái)日志
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
elastalert_logger.addHandler(console_handler)
這樣,elastalert
中日志的打印就調(diào)整好了恋拷。
2019-01-22 16:45:30.569 MainThread elastalert.py[line:1115] INFO Starting up
2019-01-22 16:45:30.573 MainThread elastalert.py[line:1245] INFO Sleeping for 29.999984 seconds
tags: [elastalert] [python 2.7]