阅读589 返回首页    go iPhone_iPad_Mac_apple


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。

  1. sudo /etc/init.d/ilogtaild stop
  2. sudo /etc/init.d/ilogtaild start
  1. # 是否打开syslog功能,false表示关闭,true表示打开。
  2. "streamlog_open" : true,
  3. # syslog用于接收日志的内存池大小,程序启动时会一次性申请这么大的内存,请根据机器内存大小以及实际需求填写,单位是MB。
  4. "streamlog_pool_size_in_mb" : 50,
  5. # logtail每次调用socket io rcv接口使用的缓冲区大小,单位是byte。
  6. "streamlog_rcv_size_each_call" : 1024,
  7. # 定义syslog的日志格式,具体含义下面会解释。
  8. "streamlog_formats":[],
  9. # logtail用于接收syslog日志的tcp端口,默认是11111
  10. "streamlog_tcp_port" : 11111

step 3: 安装rsyslog,并修改配置

如果机器已经安装rsyslog,忽略这一步。

在/etc/rsyslog.conf中根据需要修改配置,下面给一个例子:

  1. $WorkDirectory /var/spool/rsyslog # where to place spool files
  2. $ActionQueueFileName fwdRule1 # unique name prefix for spool files
  3. $ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
  4. $ActionQueueSaveOnShutdown on # save messages to disk on shutdown
  5. $ActionQueueType LinkedList # run asynchronously
  6. $ActionResumeRetryCount -1 # infinite retries if host is down
  7. # 定义日志数据的字段
  8. $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"
  9. *.* @@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)分隔,一条日志内部不可以出现换行符。
  • 日志内部除了消息正文可以包含空格,其他字段不可以包含空格。

定义日志格式如下:

  1. $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表示换行符。

举个例子,下面的日志便是满足上面格式要求的日志:

  1. 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为了解析上述日志格式,需要增加一些配置,举例如下:

  1. "streamlog_formats":
  2. [
  3. {"version": "2.1", "fields": ["level", "method"]},
  4. {"version": "2.2", "fields": []},
  5. {"version": "2.3", "fields": ["pri-text", "app-name", "syslogtag"]}
  6. ]

logtail通过读取到的version字段到streamlog_formats中找到对应的user-defined字段的格式,应用该配置,上面的日志样例version字段为2.1,包含两个自定义字段level和method,因此日志样例将被解析成如下格式:

  1. {
  2. "source": "10.101.166.127",
  3. "time": 1455776661,
  4. "level": "ERROR",
  5. "method": "com.alibaba.streamlog.App.main(App.java:17)",
  6. "msg": "connection refused, retry"
  7. }

到这里version和tag字段的作用就解释完了,简单概括就是version用于正确的解析user-defined字段,tag用于寻找数据将要被发送到的project/logstore,这两个字段不会作为日志内容发送到阿里云日志服务, 另外,logtail预定义了一些日志格式,这些内置的格式都使用0.1、1.1这样以”0.”、”1.”开头的version值,所以用户自定义version不可以以”0.”、”1.”开头。

常见日志工具接入logtail syslog log

log4j

  • 引入log4j 库.

    1. <dependency>
    2. <groupId>org.apache.logging.log4j</groupId>
    3. <artifactId>log4j-api</artifactId>
    4. <version>2.5</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.apache.logging.log4j</groupId>
    8. <artifactId>log4j-core</artifactId>
    9. <version>2.5</version>
    10. </dependency>
  • 程序中引入log4j配置文件log4j_aliyun.xml:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration status="OFF">
    3. <appenders>
    4. <Socket name="StreamLog" protocol="TCP" host="10.101.166.173" port="11111">
    5. <PatternLayout pattern="%X{version} %X{tag} %d{UNIX} %X{ip} %-5p %l %enc{%m}%n" />
    6. </Socket>
    7. </appenders>
    8. <loggers>
    9. <root level="trace">
    10. <appender-ref ref="StreamLog" />
    11. </root>
    12. </loggers>
    13. </configuration>
    其中10.101.166.173:11111是logtail所在机器的地址。
  • 程序中设置ThreadContext。

    1. package com.alibaba.streamlog;
    2. import org.apache.logging.log4j.LogManager;
    3. import org.apache.logging.log4j.Logger;
    4. import org.apache.logging.log4j.ThreadContext;
    5. public class App
    6. {
    7. private static Logger logger = LogManager.getLogger(App.class);
    8. public static void main( String[] args ) throws InterruptedException
    9. {
    10. ThreadContext.put("version", "2.1");
    11. ThreadContext.put("tag", "streamlog_tag");
    12. ThreadContext.put("ip", "127.0.0.1");
    13. while(true)
    14. {
    15. logger.error("hello world");
    16. Thread.sleep(1000);
    17. }
    18. //ThreadContext.clearAll();
    19. }
    20. }

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

  1. access_log syslog:user:info:/var/log/nginx.sock:nginx

rsyslog 配置:

  1. module(load="imuxsock") # needs to be done just once
  2. input(type="imuxsock" Socket="/var/log/nginx.sock" CreatePath="on")
  3. $template ALI_LOG_FMT,"2.3 streamlog_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %pri-text% %app-name% %syslogtag% %msg:::drop-last-lf%n"
  4. if $syslogtag == 'nginx' then @@10.101.166.173:11111;ALI_LOG_FMT

nginx

以收集nginx accesslog为例。

access log配置

  1. access_log syslog:server=unix:/var/log/nginx.sock,nohostname,tag=nginx;

rsyslog 配置:

  1. module(load="imuxsock") # needs to be done just once
  2. input(type="imuxsock" Socket="/var/log/nginx.sock" CreatePath="on")
  3. $template ALI_LOG_FMT,"2.3 streamlog_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %pri-text% %app-name% %syslogtag% %msg:::drop-last-lf%n"
  4. if $syslogtag == 'nginx' then @@10.101.166.173:11111;ALI_LOG_FMT

参考:https://nginx.org/en/docs/syslog.html

Python Syslog

example:

  1. import logging
  2. import logging.handlers
  3. logger = logging.getLogger('myLogger')
  4. logger.setLevel(logging.INFO)
  5. #add handler to the logger using unix domain socket '/dev/log'
  6. handler = logging.handlers.SysLogHandler('/dev/log')
  7. #add formatter to the handler
  8. 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"}')
  9. handler.formatter = formatter
  10. logger.addHandler(handler)
  11. logger.info("Test Message")

最后更新:2016-11-23 17:16:10

  上一篇:go producer-lib__loghub-采集_用户指南_日志服务-阿里云
  下一篇:go unity3d__loghub-采集_用户指南_日志服务-阿里云