您可以使用Rsyslog、Syslog-ng采集日志并通过Syslog协议上传到日志服务。本文介绍通过Syslog协议将日志上传到日志服务的操作步骤。
相关限制
- Syslog协议必须为标准的RFC5424协议。
- 每条日志最大支持64 KB。
- 为保证数据传输安全性,数据传输必须使用基于TCP的TLS1.2(Transport-level security)。
配置方式
注意 通常线下的VPN、路由器等设备不支持TLS协议或配置RFC5424格式,建议使用Logtail的Syslog插件采集这些设备的数据。具体操作,请参见
采集Syslog。
使用Syslog协议上传日志时,需配置日志上传地址,格式为Project名称.日志服务Endpoint:Syslog协议端口
,例如test-project-1.cn-hangzhou-intranet.log.aliyuncs.com:10009。请根据您的日志服务Project所在地域选择Endpoint。更多信息,请参见服务入口。Syslog的端口为10009。同时您需要在STRUCTURED-DATA字段中配置日志服务Project、Logstore,阿里云账号AccessKey等信息。
参数 |
说明 |
示例 |
STRUCTURED-DATA |
固定为Logservice。 |
Logservice |
Project |
日志服务Project名称,请提前在日志服务中创建Project。具体操作,请参见创建Project。
|
test-project-1 |
Logstore |
日志服务Logstore名称,请提前在日志服务中创建Logstore。具体操作,请参见创建Logstore。
|
test-logstore-1 |
access-key-id |
AccessKey ID。建议使用RAM用户的AccessKey。更多信息,请参见授权。
|
LT****9k |
access-key-secret |
AccessKey Secret。建议使用RAM用户的AccessKey。更多信息,请参见授权。
|
Wp****bA |
示例1:使用Rsyslog采集日志
Linux服务器默认自带Rsyslog。您可以使用Rsyslog采集系统日志,然后通过syslog协议上传到日志服务。不同版本的Rsyslog的配置文件略有不同,您可执行
man rsyslogd命令查看Rsyslog版本。
说明 请确保Rsyslog已安装了gnutls模块。如果未安装,请执行sudo apt-get install rsyslog-gnutls或sudo yum install rsyslog-gnutls命令进行安装。
- 打开Rsyslog配置文件。
通常Rsyslog配置文件路径为/etc/rsyslog.conf。
- 根据实际情况,配置如下信息,并添加到Rsyslog配置文件的末尾。
- Rsyslog V8及以上
其中$DefaultNetstreamDriverCAFile
配置为系统根证书所在路径。
# Setup disk assisted queues
$WorkDirectory /var/spool/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList # run asynchronously
$ActionResumeRetryCount -1 # infinite retries if host is down
$ActionSendTCPRebindInterval 100 # close and re-open the connection to the remote host every 100 of messages sent.
#RsyslogGnuTLS set to default ca path
$DefaultNetstreamDriverCAFile /etc/ssl/certs/ca-bundle.crt
template(name="LogServiceFormat" type="string"
string="<%pri%>1 %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [logservice project=\"test-project-1\" logstore=\"test-logstore-1\" access-key-id=\"<yourAccessKeyId>\" access-key-secret=\"<yourAccessKeySecret>\"] %msg%\n"
)
# Send messages to Loggly over TCP using the template.
action(type="omfwd" protocol="tcp" target="test-project-1.cn-hangzhou.log.aliyuncs.com" port="10009" template="LogServiceFormat" StreamDriver="gtls" StreamDriverMode="1" StreamDriverAuthMode="x509/name" StreamDriverPermittedPeers="*.cn-hangzhou.log.aliyuncs.com")
- Rsyslog V7及以下
其中$DefaultNetstreamDriverCAFile
配置为系统根证书所在路径。
# Setup disk assisted queues
$WorkDirectory /var/spool/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files $ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) $ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList # run asynchronously
$ActionResumeRetryCount -1 # infinite retries if host is down $ActionSendTCPRebindInterval 100 # close and re-open the connection to the remote host every 100 of messages sent.
# RsyslogGnuTLS set to default ca path
$DefaultNetstreamDriverCAFile /etc/ssl/certs/ca-bundle.crt
$ActionSendStreamDriver gtls
$ActionSendStreamDriverMode 1
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer test-project-1.cn-hangzhou.log.aliyuncs.com
template(name="LogServiceFormat" type="string" string="<%pri%>1 %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [logservice project=\"test-project-1\" logstore=\"test-logstore-1\" access-key-id=\"<yourAccessKeyId>\" access-key-secret=\"<yourAccessKeySecret>\"] %msg%\n")
*.* action(type="omfwd" protocol="tcp" target="test-project-1.cn-hangzhou.log.aliyuncs.com" port="10009" template="LogServiceFormat")
- 重启Rsyslog。
执行sudo service rsyslog restart、sudo /etc/init.d/syslog-ng restart或systemctl restart rsyslog命令重启Rsyslog。
- 使用logger命令生成测试日志。
例如执行logger hello world!命令生成日志。
示例2:使用Syslog-ng采集日志
syslog-ng是基于syslog协议的Unix和类Unix系统的开源软件。您可以执行
sudo yum install syslog-ng或
sudo apt-get install syslog-ng命令安装Syslog-ng。
说明 Linux服务器上默认安装Rsyslog,但是Rsyslog和Syslog-ng无法同时工作,如果您要使用Syslog-ng请先卸载Rsyslog。
- 打开Syslog-ng配置文件。
通常Syslog-ng配置文件地址为/etc/syslog-ng/syslog-ng.conf。
- 根据实际情况,配置如下信息,并添加到Syslog-ng配置文件的末尾。
### Syslog-ng Logging Config for LogService ###
template LogServiceFormat {
template("<${PRI}>1 ${ISODATE} ${HOST:--} ${PROGRAM:--} ${PID:--} ${MSGID:--} [logservice project=\"test-project-1\" logstore=\"test-logstore-1\" access-key-id=\"<yourAccessKeyId>\" access-key-secret=\"<yourAccessKeySecret>\"] $MSG\n"); template_escape(no);
};
destination d_logservice{
tcp("test-project-1.cn-hangzhou.log.aliyuncs.com" port(10009)
tls(peer-verify(required-untrusted))
template(LogServiceFormat));
};
log {
source(s_sys); # default use s_sys
destination(d_logservice);
};
### END Syslog-ng Logging Config for LogService ###
- 重启Syslog-ng。
执行sudo /etc/init.d/syslog-ng restart、sudo service syslog-ng restart或sudo systemctl restart syslog-ng命令重启Syslog-ng。
- 使用logger命令生成测试日志。
例如执行logger hello world!命令生成日志。
日志样例
上传日志后,您需要先配置索引,然后才能在日志服务控制台中查看日志。具体操作,请参见配置索引。
日志字段说明,请参见
RFC5424协议。
注意 为避免泄露AccessKey信息,日志服务默认删除Logservice字段。

字段名 |
说明 |
__source__ |
原始日志中的hostname字段。 |
__topic__ |
固定为syslog-forwarder。 |
__facility__ |
facility(设备、模块)信息。 |
__program__ |
进程名。 |
__serverity__ |
日志严重性。 |
__priority__ |
日志优先级。 |
__unixtimestamp__ |
原始日志中的时间戳(单位:纳秒)。 |
content |
原始日志中的msg字段。 |
常见问题与排查
- 测试日志上传
您可以使用Netcat测试日志上传,以检查网络是否连通以及AccessKey是否具有上传权限。
- 登录要测试日志上传的服务器。
- 执行以下命令安装Netcat。
sudo yum install nmap-ncat
- 执行以下命令连接日志服务。
ncat --ssl <yourProject>.<yourEndpoint> 10009
示例命令:
ncat --ssl test-project-1.cn-hangzhou.log.aliyuncs.com 10009
- Netcat不会自动判断网络连接是否中断,您需要在执行ncat命令后的30秒内,输入要发送的日志,然后按回车键。
<34>1 2019-03-28T03:00:15.003Z mymachine.example.com su - ID47 [logservice project="<yourProject>" logstore="<yourLogstore>" access-key-id="<yourAccessKeyID>" access-key-secret="<yourAccessKeySecret>"] this is a test message
示例命令:
<34>1 2019-03-28T03:00:15.003Z mymachine.example.com su - ID47 [logservice project="trace-doc-test" logstore="doc-test-001-logs" access-key-id="LTAI4***" access-key-secret="HfJEw***"] this is a test message
- 在日志服务控制台预览日志,验证日志是否上传成功。
具体操作,请参见日志预览。

- 诊断采集错误
如果手动上传日志失败,您可通过诊断采集错误查看具体报错信息。更多信息,请参见如何查看Logtail采集错误信息。
- 查看Rsyslog报错日志
Rsyslog日志默认保存在
/var/log/message中,您可通过
vim命令查看。
- 报错信息(1)
dlopen: /usr/lib64/rsyslog/lmnsd_gtls.so: cannot open shared object file: No such file or directory
该错误是因为没有安装gnutls模块,请执行sudo apt-get install rsyslog-gnutls或sudo yum install rsyslog-gnutls安装gnutls并重启Rsyslog。
- 报错信息(2)
unexpected GnuTLS error -53 - this could be caused by a broken connection. GnuTLS reports:Error in the push function
该错误是因为TCP连接长期闲置被强制关闭,Rsyslog会进行自动重连,您无需关注。
- 查看Syslog-ng报错日志
Syslog-ng日志默认保存在Journal日志中,您可执行systemctl status syslog-ng.service和journalctl -xe命令查看日志。
如果出现如下报错,请检查配置文件格式是否合法或配置是否存在冲突,例如不支持配置多个
internal()
。
Job for syslog-ng.service failed because the control process exited with error code. See "systemctl status syslog-ng.service" and "journalctl -xe" for details