syslog__loghub-采集_用户指南_日志服务-阿里云
logtail目前支持的接入端主要有syslog和文本文件,如下图所示:
本文将重点介绍怎么将syslog数据打通logtail,进而收集到LogHub。
- syslog是什么?
可以参考鸟哥的Linux私房菜。
- 和利用文本文件相比,使用syslog有哪些优势?
不落盘、保密性好。免去了文件落盘和解析的代价,单机可达80MB/S吞吐率
logtail支持在本地配置tcp端口,接收syslog agent转发过来的日志,logtail、syslog、loghub三者之间的关系如下图所示,logtail开启tcp端口,接收rsyslog或者其他syslog agent通过tcp协议转发过来的syslog数据,logtail解析接收到的数据并转发到loghub中。
如果要使用该功能,请按照以下步骤操作:
step 1: 控制台创建syslog相关配置
控制台创建logtail syslog配置,配置中需要填写tag域,并将syslog log配置应用到machine group上,假设这一步配置的tag是sys_tag。
step 2: 配置Logtail使得协议生效
从机器logtail安装目录下找到ilogtail_config.json,一般在目录/usr/local/ilogtail/下面,根据需求修改和syslog相关的配置,修改完之后使用重启logtail。重启logtail要先stop掉再start。
sudo /etc/init.d/ilogtaild stop
sudo /etc/init.d/ilogtaild start
# 是否打开syslog功能,false表示关闭,true表示打开。
"streamlog_open" : true,
# syslog用于接收日志的内存池大小,程序启动时会一次性申请这么大的内存,请根据机器内存大小以及实际需求填写,单位是MB。
"streamlog_pool_size_in_mb" : 50,
# logtail每次调用socket io rcv接口使用的缓冲区大小,单位是byte。
"streamlog_rcv_size_each_call" : 1024,
# 定义syslog的日志格式,具体含义下面会解释。
"streamlog_formats":[],
# logtail用于接收syslog日志的tcp端口,默认是11111
"streamlog_tcp_port" : 11111
step 3: 安装rsyslog,并修改配置
如果机器已经安装rsyslog,忽略这一步。
在/etc/rsyslog.conf中根据需要修改配置,下面给一个例子:
$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
# 定义日志数据的字段
$template ALI_LOG_FMT,"0.1 sys_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %hostname% %pri-text% %protocol-version% %app-name% %procid% %msgid% %msg:::drop-last-lf%n"
*.* @@10.101.166.173:11111;ALI_LOG_FMT
注意模板ALI_LOG_FMT中第二个域的值是sys_tag,这个取值必须和step 1中创建的一致,这个配置的含义是将本机接收到的所有(*.*)syslog日志按照ALI_LOG_FMT格式化,使用tcp协议转发到10.101.166.173:11111。机器10.101.166.173必须在step 1中的machine group中并且按照step 2配置好。
接着启动rsyslog(sudo /etc/init.d/rsyslog restart),启动之前请先检查机器上是否安装了其他syslog的agent,比如syslogd、sysklogd、syslog-ng等,如果有的话请stop掉。
上面三步走完之后就可以将机器上的syslog收集到日志服务了,下面将讨论格式化syslog日志的方式以及收集的原理,如果不需要格式化syslog数据,可以忽略。
基本原理
logtail通过tcp端口接收到的数据是流式的,如果要从流式的数据中解析出一条条的日志,日志格式必须满足一些要求:
- 每条日志之间使用换行符(n)分隔,一条日志内部不可以出现换行符。
- 日志内部除了消息正文可以包含空格,其他字段不可以包含空格。
定义日志格式如下:
$version $tag $unixtimestamp $ip [$user-defined-field-1 $user-defined-field-2 $user-defined-field-n] $msgn"
各个字段含义为:
- version: 该日志格式的版本号,logtail使用该版本号解析user-defined-field字段,具体解析方法后面会解释。
- tag: 数据标签,用于寻找project/logstore,和上面step 1中的tag含义相同,不可以包含空格和换行符。
- unixtimestamp: 该条日志的时间戳。
- ip: 该条日志的对应的机器ip,如果日志中的该字段是127.0.0.1,最终发往服务端的日志数据中该字段会被替换成tcp socket的对端地址。
- user-defined-field: 用户自定义字段,中括号表示是可选字段,可以有0个或多个,不可以包含空格和换行符。
- msg: 日志消息正文,不可以包含换行符,末尾的n表示换行符。
举个例子,下面的日志便是满足上面格式要求的日志:
2.1 streamlog_tag 1455776661 10.101.166.127 ERROR com.alibaba.streamlog.App.main(App.java:17) connection refused, retry
原理讲到这里大家就会发现不仅syslog日志可以接入logtail,任何日志工具只要能满足下面两点要求,都可以接入:
- 可以将日志格式化,格式化之后的日志格式满足上面的要求。
- 可以通过tcp协议将日志append到远端。
logtail为了解析上述日志格式,需要增加一些配置,举例如下:
"streamlog_formats":
[
{"version": "2.1", "fields": ["level", "method"]},
{"version": "2.2", "fields": []},
{"version": "2.3", "fields": ["pri-text", "app-name", "syslogtag"]}
]
logtail通过读取到的version字段到streamlog_formats中找到对应的user-defined字段的格式,应用该配置,上面的日志样例version字段为2.1,包含两个自定义字段level和method,因此日志样例将被解析成如下格式:
{
"source": "10.101.166.127",
"time": 1455776661,
"level": "ERROR",
"method": "com.alibaba.streamlog.App.main(App.java:17)",
"msg": "connection refused, retry"
}
到这里version和tag字段的作用就解释完了,简单概括就是version用于正确的解析user-defined字段,tag用于寻找数据将要被发送到的project/logstore,这两个字段不会作为日志内容发送到阿里云日志服务, 另外,logtail预定义了一些日志格式,这些内置的格式都使用0.1、1.1这样以”0.”、”1.”开头的version值,所以用户自定义version不可以以”0.”、”1.”开头。
常见日志工具接入logtail syslog log
log4j
引入log4j 库.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
- 程序中引入log4j配置文件log4j_aliyun.xml:
其中10.101.166.173:11111是logtail所在机器的地址。<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Socket name="StreamLog" protocol="TCP" host="10.101.166.173" port="11111">
<PatternLayout pattern="%X{version} %X{tag} %d{UNIX} %X{ip} %-5p %l %enc{%m}%n" />
</Socket>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="StreamLog" />
</root>
</loggers>
</configuration>
程序中设置ThreadContext。
package com.alibaba.streamlog;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class App
{
private static Logger logger = LogManager.getLogger(App.class);
public static void main( String[] args ) throws InterruptedException
{
ThreadContext.put("version", "2.1");
ThreadContext.put("tag", "streamlog_tag");
ThreadContext.put("ip", "127.0.0.1");
while(true)
{
logger.error("hello world");
Thread.sleep(1000);
}
//ThreadContext.clearAll();
}
}
tengine
tengine 可以通过syslog接入ilogtail.
tengine使用ngx_http_log_module模块将日志打入本地syslog agent,在本地syslog agent中forward到rsyslog。
tengine配置syslog请参考:https://tengine.taobao.org/document_cn/http_log_cn.html
example:
以user类型和info级别将access log发送给本机Unix dgram(/dev/log),并设置应用标记为nginx
access_log syslog:user:info:/var/log/nginx.sock:nginx
rsyslog 配置:
module(load="imuxsock") # needs to be done just once
input(type="imuxsock" Socket="/var/log/nginx.sock" CreatePath="on")
$template ALI_LOG_FMT,"2.3 streamlog_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %pri-text% %app-name% %syslogtag% %msg:::drop-last-lf%n"
if $syslogtag == 'nginx' then @@10.101.166.173:11111;ALI_LOG_FMT
nginx
以收集nginx accesslog为例。
access log配置
access_log syslog:server=unix:/var/log/nginx.sock,nohostname,tag=nginx;
rsyslog 配置:
module(load="imuxsock") # needs to be done just once
input(type="imuxsock" Socket="/var/log/nginx.sock" CreatePath="on")
$template ALI_LOG_FMT,"2.3 streamlog_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %pri-text% %app-name% %syslogtag% %msg:::drop-last-lf%n"
if $syslogtag == 'nginx' then @@10.101.166.173:11111;ALI_LOG_FMT
参考:https://nginx.org/en/docs/syslog.html
Python Syslog
example:
import logging
import logging.handlers
logger = logging.getLogger('myLogger')
logger.setLevel(logging.INFO)
#add handler to the logger using unix domain socket '/dev/log'
handler = logging.handlers.SysLogHandler('/dev/log')
#add formatter to the handler
formatter = logging.Formatter('Python: { "loggerName":"%(name)s", "asciTime":"%(asctime)s", "pathName":"%(pathname)s", "logRecordCreationTime":"%(created)f", "functionName":"%(funcName)s", "levelNo":"%(levelno)s", "lineNo":"%(lineno)d", "time":"%(msecs)d", "levelName":"%(levelname)s", "message":"%(message)s"}')
handler.formatter = formatter
logger.addHandler(handler)
logger.info("Test Message")
最后更新:2016-11-23 17:16:10
上一篇:
producer-lib__loghub-采集_用户指南_日志服务-阿里云
下一篇:
unity3d__loghub-采集_用户指南_日志服务-阿里云
数据推送__性能篇_最佳实践_开放搜索-阿里云
工作流设计器__数据开发手册_用户操作指南_大数据开发套件-阿里云
使用 DTS 迁移 SQL Server 数据__迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云
废弃堆栈__堆栈相关接口_API 文档_资源编排-阿里云
负载均衡计费常见问题___常见问题_负载均衡-阿里云
删除标签__标签_用户指南_云服务器 ECS-阿里云
APP维度推送统计__API列表_OpenAPI 1.0_移动推送-阿里云
syslog__loghub-采集_用户指南_日志服务-阿里云
使用ECS的API和SDK查询内容只能返回10条信息的原因__附录_API 参考_云服务器 ECS-阿里云
ECS API 产品和业务限制__购买指南_云服务器 ECS-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云