Featured image of post rsyslog 同步nginx日志存储到其他服务器

rsyslog 同步nginx日志存储到其他服务器

原来使用的日志持久化方案是多线程异步解析nginx日志同步到mysql,由于项目现场访问量太高,且目前不具备升级条件,项目组希望我们把日志同步到其他机器去解析,所以就有了这个文章: 我的建议是使用rsyslog作为接收端,nginx直接发送日志到rsyslog上

rsyslog版本如下(怎么安装随你,编译或者yum都可以):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
rsyslogd  8.2102.0-117.el9 (aka 2021.02) compiled with:
        PLATFORM:                               x86_64-redhat-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes
        GSSAPI Kerberos 5 support:              Yes
        FEATURE_DEBUG (debug build, slow code): No
        32bit Atomic operations supported:      Yes
        64bit Atomic operations supported:      Yes
        memory allocator:                       system default
        Runtime Instrumentation (slow code):    No
        uuid support:                           Yes
        systemd support:                        Yes
        Config file:                            /etc/rsyslog.conf
        PID file:                               /var/run/rsyslogd.pid
        Number of Bits in RainerScript integers: 64

See https://www.rsyslog.com for more information.

配置文件如下(这里你最不能修改的就是我的template,我调了很久):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# rsyslog配置文件

# 更多信息,请参阅 /usr/share/doc/rsyslog-*/rsyslog_conf.html
# 或者在线查看最新版本 http://www.rsyslog.com/doc/rsyslog_conf.html
# 如果您遇到问题,请查看 http://www.rsyslog.com/doc/troubleshoot.html

#### 全局指令 ####

# 放置辅助文件的位置
global(workDirectory="/var/lib/rsyslog")

# 使用自定义格式
template(name="NoHeaderLogFormat" type="string" string="%msg:2:$%\n")
#module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
module(load="builtin:omfile" Template="NoHeaderLogFormat")

#### 模块 ####

# 在514端口启用UDP syslog接收
module(load="imudp")
input(type="imudp" port="514")

# 包含 /etc/rsyslog.d/ 目录下的所有配置文件
include(file="/etc/rsyslog.d/*.conf" mode="optional")

# 禁用未使用的模块 (为参考而注释掉)
#module(load="imuxsock"    # 提供本地系统日志记录支持(例如通过logger命令)
#    SysSock.Use="off") # 关闭通过本地日志套接字接收消息;
#             # 现在通过imjournal获取本地消息。
#module(load="imjournal")    # 提供对systemd日志的访问(用于UDP接收时不需要)
#module(load="imklog") # 读取内核消息(用于UDP接收时不需要)
#module(load="immark") # 提供--MARK--消息功能

#### 规则 ####

# 所有接收到的UDP消息都写入 /usr/openresty/nginx/log/access.log
*.*  /usr/openresty/nginx/log/access.log

nginx配置,只保留同步的逻辑,去掉本地存储的部分:

1
2
3
4
5
6
http {
    ...
    access_log  syslog:server=192.168.31.166:514 access if=$loggable;
    #access_log  logs/access.log access buffer=256k flush=5s if=$loggable;
    ...
}