如何在uWSGI中生成包含访问与应用日志的合并日志文件?
实现uWSGI合并访问与应用日志到单个文件的方法
当然可以实现,下面提供两种直接有效的配置方式:
方法一:添加多日志输出目标
直接给访问日志(req-logger)和应用日志(logger)各新增一个指向all_logs文件的输出条目,这样两类日志会同时写入各自的独立文件和合并文件。
修改后的完整配置如下:
[uwsgi] master = true http-socket = xyz_port memory-report = true module = demo_app.wsgi ... ... ... log-date = %%d/%%m/%%Y %%H:%%M:%%S %%Z logformat-strftime = true logger = stdio log-format = %(addr) - %(user) [%(ftime)] "%(method) %(uri) %(proto)" %(status) %(size) %(referer) %(uagent) %(pid) # 原有访问日志输出 req-logger = file:/var/log/demo_app/access_log-@(exec://date +%%Y-%%m-%%d).log # 新增:访问日志同时写入合并文件 req-logger = file:/var/log/demo_app/all_logs-@(exec://date +%%Y-%%m-%%d).log # 原有应用日志输出 logger = file:/var/log/demo_app/app_log-@(exec://date +%%Y-%%m-%%d).log # 新增:应用日志同时写入合并文件 logger = file:/var/log/demo_app/all_logs-@(exec://date +%%Y-%%m-%%d).log log-reopen = true
说明
log-reopen = true会每天重新执行date命令生成新的日志文件名,确保日志按天分割- 两类日志会各自追加到
all_logs文件中,保留原有日志格式
方法二:使用管道实现日志复制
借助系统tee命令,通过管道将日志内容同时写入独立文件和合并文件,这种方式可以减少重复配置条目:
[uwsgi] master = true http-socket = xyz_port memory-report = true module = demo_app.wsgi ... ... ... log-date = %%d/%%m/%%Y %%H:%%M:%%S %%Z logformat-strftime = true logger = stdio log-format = %(addr) - %(user) [%(ftime)] "%(method) %(uri) %(proto)" %(status) %(size) %(referer) %(uagent) %(pid) # 访问日志写入独立文件,同时通过tee追加到合并文件 req-logger = pipe:tee -a /var/log/demo_app/access_log-@(exec://date +%%Y-%%m-%%d).log /var/log/demo_app/all_logs-@(exec://date +%%Y-%%m-%%d).log # 应用日志写入独立文件,同时通过tee追加到合并文件 logger = pipe:tee -a /var/log/demo_app/app_log-@(exec://date +%%Y-%%m-%%d).log /var/log/demo_app/all_logs-@(exec://date +%%Y-%%m-%%d).log log-reopen = true
注意事项
- 确保系统中存在
tee命令(绝大多数Linux发行版默认自带) - 运行uWSGI的用户需要对
/var/log/demo_app/目录有读写权限 - 若需要按天分割日志,
log-reopen = true必须开启,否则date命令只会在uWSGI启动时执行一次,后续不会生成新文件
内容的提问来源于stack exchange,提问作者Akash Pagar
相关产品推荐
相关产品推荐

