玩转苍穹日志输出方法

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

玩转苍穹日志输出方法

苍穹采用Logback开源日志组件,相比log4j,logback不仅性能提升了,初始化内存加载也更小了。

苍穹的日志输出是在mc管理中心进行配置,一般是在公共配置项配置log.config值。如果多个环境可在集群管理覆写。

苍穹日志滚动方式

  • 基于时间滚动

每次只能生成一个文件,比如时间到天的话,每天只能生成一个文件。无论一个文件有多大,都只会输出到这一个文件中去,对于比较关注日志,每天需要备份日志文件的客户比较适合。

<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/tlog.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- compress file like xxxx.log.zip -->
      <fileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd-HH-mm}.log</fileNamePattern>
      <!-- keep 30 days' worth of history -->
      <maxHistory>30</maxHistory>
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
</appender>
  • 基于窗口滚动--(推荐使用)

每次文件达到一定大小时会截断日志并将其压缩打包,然后根据设置的保留数据进行窗口滚动。这样日志自动清理就能避免因日志过大将磁盘空间撑满的问题。

 <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <file>${LOG_HOME}/log.log</file>
   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${LOG_HOME}/log.%i.log.gz</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>20</maxIndex>
   </rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
       <maxFileSize>10MB</maxFileSize>
       </triggeringPolicy>
   <encoder>
      <pattern> %date [%thread] %-5level %logger{50} [%file:%line] %msg%n </pattern>
   </encoder>
</appender>

日志输出级别

日志输出级别有:INFO、ERROR、WARNING、DEBUG

苍穹默认INFO级别是将所有的级别日志都输出出来的。可以通过 filter 来输出特定级别的日志。如:

<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
  <level>INFO</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>

日志输出路径

日志输出路径有:

kafka:苍穹将日志生产消息至kafka,由logstash消费kafka中的日志消息,再输出到elasticsearch进行存储。而苍穹monitor的日志查询是从elasticsearch中查看日志

file:输出到本地文件,默认路径在 mservice/logs下。

stdot:默认非容器化部署是写入到std.out文件中,容器化部署是输出到控制台日志中


本地开发环境的同学是不是经常有这样的困扰,日志控制台处经常刷屏报连不上kafka错误日志,使得本地调试起来经常看不到日志。为解决本地环境控制台总是抛出kafka连接错误日志而干扰日志分析,可以通过覆写log.config值使本地环境日志只输出到控制台,而不连接kafka。配置方法参考如下:

System.setProperty("log.config","<?xml version=\"1.0\" encoding=\"UTF-8\" ?><configuration><appender name=\"stdot\" class=\"ch.qos.logback.core.ConsoleAppender\"><layout class=\"ch.qos.logback.classic.PatternLayout\"><pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\\(%L\\):%m%n</pattern></layout></appender><root level=\"INFO\"><appender-ref ref=\"stdot\" /></root></configuration>");

日志转换长度

通过%logger控制输出日志事件长度,如下:

%loggermainPackage.sub.sample.BarmainPackage.sub.sample.Bar
%logger{0}mainPackage.sub.sample.BarBar
%logger{5}mainPackage.sub.sample.Barm.s.s.Bar
%logger{10}mainPackage.sub.sample.Barm.s.s.Bar
%logger{15}mainPackage.sub.sample.Barm.s.sample.Bar
%logger{16}mainPackage.sub.sample.Barm.sub.sample.Bar
%logger{26}mainPackage.sub.sample.BarmainPackage.sub.sample.Bar

Image.webp

Image1.webp

扩展案例

不同级别的日志输出到不同文件

核心配置:

<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>

如下:将info输出到log-info.log中,将error日志输出到log-error.log中

<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <file>${LOG_HOME}/log-error.log</file>
   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${LOG_HOME}/log-error.%i.log.gz</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>20</maxIndex>
   </rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
       <maxFileSize>10MB</maxFileSize>
       </triggeringPolicy>
   <encoder>
      <pattern> %date [%thread] %-5level %logger{10} [%file:%line] %msg%n </pattern>
   </encoder>
   <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <file>${LOG_HOME}/log-info.log</file>
   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>${LOG_HOME}/log-info.%i.log.gz</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>20</maxIndex>
   </rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
       <maxFileSize>10MB</maxFileSize>
       </triggeringPolicy>
   <encoder>
      <pattern> %date [%thread] %-5level %logger{10} [%file:%line] %msg%n </pattern>
   </encoder>
   <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
    <root level="INFO">
       <appender-ref ref="kafka" />
       <appender-ref ref="error" />
       <appender-ref ref="info" />
    </root>


最后有兴趣的同学可以深入研究logback的更多用法:

http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout

玩转苍穹日志输出方法

苍穹采用Logback开源日志组件,相比log4j,logback不仅性能提升了,初始化内存加载也更小了。苍穹的日志输出是在mc管理中心进行配置,一般...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息