日志套餐篇 - log4j2 logback全量套餐


前情提要:

Log4j Log4j2 logback是当下主流的日志框架

slf4j则是新一代的日志框架接口,logback直接实现了slf4j接口,另外logback是SpringBoot最新的默认日志框架

综合来看性能上依然推荐:log4j2(拥有logback全部特性)

**注:**鉴于log4j已经跟不上时代的要求,因此不做特别的介绍,其实log4j的配置,完全可以在log4j2上使用

普通工程 - 建议集成log4j2

普通工程即:普通的java项目, 如个人的代码Demo或者准备打成jar使用的,推荐使用log4j2

必要依赖如下:

  1. <!-- log4j2 必要依赖 -->
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-api</artifactId>
  5. <version>2.10.0</version>
  6. </dependency>
  7. <!-- log4j2 必要依赖 -->
  8. <dependency>
  9. <groupId>org.apache.logging.log4j</groupId>
  10. <artifactId>log4j-core</artifactId>
  11. <version>2.10.0</version>
  12. </dependency>
  13. <!-- slf4j核心包 -->
  14. <dependency>
  15. <groupId>org.slf4j</groupId>
  16. <artifactId>slf4j-api</artifactId>
  17. <version>1.7.25</version>
  18. </dependency>
  19. <!--用于与slf4j保持桥接-->
  20. <dependency>
  21. <groupId>org.apache.logging.log4j</groupId>
  22. <artifactId>log4j-slf4j-impl</artifactId>
  23. <version>2.10.0</version>
  24. </dependency>

配置如下:

Maven项目只需要在resource里面加入log4j2.xml配置文件即可

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
  3. <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
  4. <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
  5. <Configuration status="WARN" monitorInterval="30">
  6. <!--全局属性-->
  7. <Properties>
  8. <Property name="APP_NAME">kerwinTools</Property>
  9. <Property name="LOG_FILE_PATH">/log/${APP_NAME}</Property>
  10. <Property name="PATTERN_FORMAT">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %class{36} (%L) %M - %msg%xEx%n</Property>
  11. </Properties>
  12. <Appenders>
  13. <!--输出到控制台-->
  14. <Console name="Console" target="SYSTEM_OUT">
  15. <PatternLayout pattern="${PATTERN_FORMAT}"/>
  16. </Console>
  17. <!-- INFO_LOG -->
  18. <RollingFile name="INFO_LOG" fileName="${LOG_FILE_PATH}/info.log" filePattern="${LOG_HOME}/info.log_%d{yyyy-MM-dd}.log">
  19. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  20. <Filters>
  21. <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
  22. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
  23. </Filters>
  24. <PatternLayout>
  25. <pattern>${PATTERN_FORMAT}</pattern>
  26. </PatternLayout>
  27. <Policies>
  28. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  29. </Policies>
  30. <DefaultRolloverStrategy>
  31. <Delete basePath="${LOG_FILE_PATH}" maxDepth="1">
  32. <IfFileName glob="info.log_*" />
  33. <IfLastModified age="5d" />
  34. </Delete>
  35. </DefaultRolloverStrategy>
  36. </RollingFile>
  37. <!-- DEBUG_LOG -->
  38. <RollingFile name="DEBUG_LOG" fileName="${LOG_FILE_PATH}/debug.log" filePattern="${LOG_HOME}/debug.log_%d{yyyy-MM-dd}.log">
  39. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  40. <Filters>
  41. <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
  42. <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
  43. </Filters>
  44. <PatternLayout>
  45. <pattern>${PATTERN_FORMAT}</pattern>
  46. </PatternLayout>
  47. <Policies>
  48. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  49. </Policies>
  50. <DefaultRolloverStrategy>
  51. <Delete basePath="${LOG_FILE_PATH}" maxDepth="1">
  52. <IfFileName glob="debug.log_*" />
  53. <IfLastModified age="5d" />
  54. </Delete>
  55. </DefaultRolloverStrategy>
  56. </RollingFile>
  57. <!-- ERROR_LOG -->
  58. <RollingFile name="ERROR_LOG" fileName="${LOG_FILE_PATH}/error.log" filePattern="${LOG_HOME}/error.log_%d{yyyy-MM-dd}.log">
  59. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  60. <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
  61. <PatternLayout>
  62. <pattern>${PATTERN_FORMAT}</pattern>
  63. </PatternLayout>
  64. <Policies>
  65. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  66. </Policies>
  67. <DefaultRolloverStrategy>
  68. <Delete basePath="${LOG_FILE_PATH}" maxDepth="1">
  69. <IfFileName glob="error.log_*" />
  70. <IfLastModified age="5d" />
  71. </Delete>
  72. </DefaultRolloverStrategy>
  73. </RollingFile>
  74. </Appenders>
  75. <Loggers>
  76. <!-- LOG everything at DEBUG level 默认级别为DEBUG -->
  77. <Root level="DEBUG">
  78. <AppenderRef ref="Console"/>
  79. <AppenderRef ref="INFO_LOG"/>
  80. <AppenderRef ref="DEBUG_LOG"/>
  81. <AppenderRef ref="ERROR_LOG"/>
  82. </Root>
  83. </Loggers>
  84. </Configuration>

**注:**日志打印的位置我并没用做特别的约束,所以它会在项目所存储的盘符自动建立${APP_NAME} 文件夹

效果如图所示:

SpringBoot项目 - 个人练习建议集成logback

  1. // 由于springboot默认支持logbak 因此无需任何依赖即可使用,当然需要一些默认的必备依赖 如 web等...

application配置如下:

  1. # 约束mybis-dao级别为dao层
  2. logging.level.com.cat.dao=DEBUG
  3. logging.config=classpath:logback-spring.xml
  4. # 文件输出位置即文件夹名称
  5. logging.file=/log/volcat-server

配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
  3. <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
  4. <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
  5. <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
  6. <configuration scan="true" scanPeriod="10 seconds">
  7. <contextName>logback</contextName>
  8. <!-- 命名为logback-spring 可以读取spring中的配置信息, 以下即为读取spring的日志输出地址 -->
  9. <springProperty scope="context" name="log.path" source="logging.file"/>
  10. <!-- 在当前文件中约束配置地址 -->
  11. <!--<property name="log.path" value="/log/demo_test_nginx" />-->
  12. <!--
  13. <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
  14. 以及指定<appender>。<logger>仅有一个name属性,
  15. 一个可选的level和一个可选的addtivity属性。
  16. name:用来指定受此logger约束的某一个包或者具体的某一个类。
  17. level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
  18. 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
  19. 如果未设置此属性,那么当前logger将会继承上级的级别。
  20. addtivity:是否向上级logger传递打印信息。默认是true
  21. -->
  22. <!-- 彩色日志 -->
  23. <!-- 彩色日志依赖的渲染类 -->
  24. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  25. <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
  26. <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
  27. <!-- 彩色日志格式 -->
  28. <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39} %line){cyan} %clr(:) %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  29. <!--输出到控制台-->
  30. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  31. <!--此日志appender是为开发使用,配置为DEBUG级别, 控制台输出的日志级别是大于或等于此级别的日志信息-->
  32. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  33. <level>debug</level>
  34. </filter>
  35. <encoder>
  36. <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
  37. <!-- 设置字符集 -->
  38. <charset>UTF-8</charset>
  39. </encoder>
  40. </appender>
  41. <!--输出到文件-->
  42. <!-- 时间滚动输出 level为 DEBUG 日志 -->
  43. <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  44. <!-- 正在记录的日志文件的路径及文件名 -->
  45. <file>${log.path}/debug.log</file>
  46. <!--日志文件输出格式-->
  47. <encoder>
  48. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  49. <charset>UTF-8</charset> <!-- 设置字符集 -->
  50. </encoder>
  51. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  52. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  53. <!-- 日志归档 -->
  54. <fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  55. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  56. <maxFileSize>100MB</maxFileSize>
  57. </timeBasedFileNamingAndTriggeringPolicy>
  58. <!--日志文件保留天数-->
  59. <maxHistory>15</maxHistory>
  60. </rollingPolicy>
  61. <!-- 此日志文件只记录debug级别的 -->
  62. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  63. <level>debug</level>
  64. <onMatch>ACCEPT</onMatch>
  65. <onMismatch>DENY</onMismatch>
  66. </filter>
  67. </appender>
  68. <!-- 时间滚动输出 level为 INFO 日志 -->
  69. <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  70. <!-- 正在记录的日志文件的路径及文件名 -->
  71. <file>${log.path}/info.log</file>
  72. <!--日志文件输出格式-->
  73. <encoder>
  74. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  75. <charset>UTF-8</charset>
  76. </encoder>
  77. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  78. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  79. <!-- 每天日志归档路径以及格式 -->
  80. <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  81. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  82. <maxFileSize>100MB</maxFileSize>
  83. </timeBasedFileNamingAndTriggeringPolicy>
  84. <!--日志文件保留天数-->
  85. <maxHistory>15</maxHistory>
  86. </rollingPolicy>
  87. <!-- 此日志文件只记录info级别的 -->
  88. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  89. <level>info</level>
  90. <onMatch>ACCEPT</onMatch>
  91. <onMismatch>DENY</onMismatch>
  92. </filter>
  93. </appender>
  94. <!-- 时间滚动输出 level为 WARN 日志 -->
  95. <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  96. <!-- 正在记录的日志文件的路径及文件名 -->
  97. <file>${log.path}/warn.log</file>
  98. <!--日志文件输出格式-->
  99. <encoder>
  100. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  101. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  102. </encoder>
  103. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  104. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  105. <fileNamePattern>${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  106. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  107. <maxFileSize>100MB</maxFileSize>
  108. </timeBasedFileNamingAndTriggeringPolicy>
  109. <!--日志文件保留天数-->
  110. <maxHistory>15</maxHistory>
  111. </rollingPolicy>
  112. <!-- 此日志文件只记录warn级别的 -->
  113. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  114. <level>warn</level>
  115. <onMatch>ACCEPT</onMatch>
  116. <onMismatch>DENY</onMismatch>
  117. </filter>
  118. </appender>
  119. <!-- 时间滚动输出 level为 ERROR 日志 -->
  120. <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  121. <!-- 正在记录的日志文件的路径及文件名 -->
  122. <file>${log.path}/error.log</file>
  123. <!--日志文件输出格式-->
  124. <encoder>
  125. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  126. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  127. </encoder>
  128. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  129. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  130. <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  131. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  132. <maxFileSize>100MB</maxFileSize>
  133. </timeBasedFileNamingAndTriggeringPolicy>
  134. <!--日志文件保留天数-->
  135. <maxHistory>15</maxHistory>
  136. </rollingPolicy>
  137. <!-- 此日志文件只记录ERROR级别的 -->
  138. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  139. <level>ERROR</level>
  140. <onMatch>ACCEPT</onMatch>
  141. <onMismatch>DENY</onMismatch>
  142. </filter>
  143. </appender>
  144. <!--
  145. root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
  146. level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
  147. 不能设置为INHERITED或者同义词NULL。默认是DEBUG
  148. 可以包含零个或多个元素,标识这个appender将会添加到这个logger。
  149. -->
  150. <root level="info">
  151. <appender-ref ref="CONSOLE" />
  152. <appender-ref ref="DEBUG_FILE" />
  153. <appender-ref ref="INFO_FILE" />
  154. <appender-ref ref="WARN_FILE" />
  155. <appender-ref ref="ERROR_FILE" />
  156. </root>
  157. </configuration>

SpringBoot项目 - 集成log4j2

必备依赖 - 既然是SpringBoot项目,那用官方的starter是最好的,版本什么的都不用管

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <!-- 去除logback日志依赖 -->
  6. <exclusion>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-logging</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <!-- 导入log4j2-starter -->
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-log4j2</artifactId>
  16. </dependency>
  17. <!-- log4j2 异步打印必要依赖 -->
  18. <dependency>
  19. <groupId>com.lmax</groupId>
  20. <artifactId>disruptor</artifactId>
  21. <version>3.3.4</version>
  22. </dependency>

applications配置

  1. # mybatis-dao相关的操作为DEBUG级别, 数据库日志会打印到debug文件中
  2. logging.level.com.cat.dao=DEBUG
  3. logging.config=classpath:log4j2.xml

配置文件 - 沿用上面的配置文件即可,必要情况可以修改打印的日志级别,如

  1. .....
  2. <Loggers>
  3. <!--过滤掉springmybatis的一些无用的DEBUG信息-->
  4. <Logger name="org.springframework" level="INFO"/>
  5. <Logger name="org.mybatis" level="INFO"/>
  6. <!-- LOG everything at INFO level -->
  7. <Root level="INFO">
  8. <AppenderRef ref="Console"/>
  9. <AppenderRef ref="INFO_LOG"/>
  10. <AppenderRef ref="DEBUG_LOG"/>
  11. <AppenderRef ref="ERROR_LOG"/>
  12. </Root>
  13. </Loggers>

SpringBoot - log4j2 企业级方案

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration>
  3. <properties>
  4. <property name="LOG_HOME">/log/volcat-server</property>
  5. </properties>
  6. <Appenders>
  7. <!-- 輸出到監視器 -->
  8. <Console name="Console" target="SYSTEM_OUT">
  9. <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />
  10. </Console>
  11. <RollingFile name="error.log" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error.log_%d{yyyy-MM-dd}.log">
  12. <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />
  13. <Policies>
  14. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  15. </Policies>
  16. <DefaultRolloverStrategy>
  17. <Delete basePath="${LOG_HOME}" maxDepth="1">
  18. <IfFileName glob="error.log_*" />
  19. <IfLastModified age="5d" />
  20. </Delete>
  21. </DefaultRolloverStrategy>
  22. </RollingFile>
  23. <RollingFile name="debug.log" fileName="${LOG_HOME}/debug.log" filePattern="${LOG_HOME}/debug.log_%d{yyyy-MM-dd}.log">
  24. <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />
  25. <Policies>
  26. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  27. </Policies>
  28. <DefaultRolloverStrategy>
  29. <Delete basePath="${LOG_HOME}" maxDepth="1">
  30. <IfFileName glob="debug.log_*" />
  31. <IfLastModified age="5d" />
  32. </Delete>
  33. </DefaultRolloverStrategy>
  34. </RollingFile>
  35. <RollingFile name="message.log" fileName="${LOG_HOME}/message.log" filePattern="${LOG_HOME}/message.log_%d{yyyy-MM-dd}.log">
  36. <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />
  37. <Policies>
  38. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  39. </Policies>
  40. <DefaultRolloverStrategy>
  41. <Delete basePath="${LOG_HOME}" maxDepth="1">
  42. <IfFileName glob="message.log_*" />
  43. <IfLastModified age="5d" />
  44. </Delete>
  45. </DefaultRolloverStrategy>
  46. </RollingFile>
  47. <RollingFile name="access.log" fileName="${LOG_HOME}/access.log" filePattern="${LOG_HOME}/access.log_%d{yyyy-MM-dd}.log">
  48. <PatternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss,SSS} [%thread][%level] - %msg%n" />
  49. <Policies>
  50. <TimeBasedTriggeringPolicy interval="1" modulate="true" />
  51. </Policies>
  52. <DefaultRolloverStrategy>
  53. <Delete basePath="${LOG_HOME}" maxDepth="1">
  54. <IfFileName glob="access.log_*" />
  55. <IfLastModified age="5d" />
  56. </Delete>
  57. </DefaultRolloverStrategy>
  58. </RollingFile>
  59. </Appenders>
  60. <Loggers>
  61. <Logger name="sys.error" level="ERROR">
  62. <AppenderRef ref="error.log" />
  63. </Logger>
  64. <Logger name="sys.debug" level="DEBUG">
  65. <AppenderRef ref="debug.log" />
  66. </Logger>
  67. <Logger name="sys.message" level="INFO">
  68. <AppenderRef ref="message.log" />
  69. </Logger>
  70. <Logger name="sys.access" level="INFO">
  71. <AppenderRef ref="access.log" />
  72. </Logger>
  73. </Loggers>
  74. </Configuration>

Logit工具类

  1. package com.mine.log;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. public class Logit {
  5. private static final Logger DEBUG_LOG = LoggerFactory.getLogger("sys.debug");
  6. private static final Logger WARN_LOG = LoggerFactory.getLogger("sys.warn");
  7. private static final Logger MESSAGE_LOG = LoggerFactory.getLogger("sys.message");
  8. private static final Logger ACCESS_LOG = LoggerFactory.getLogger("sys.access");
  9. private static final Logger ERROR_LOG = LoggerFactory.getLogger("sys.error");
  10. private static final Logger DB_LOG = LoggerFactory.getLogger("db.sql");
  11. public Logit() {}
  12. public static void accessLog(String log) {
  13. ACCESS_LOG.info(log);
  14. }
  15. public static void messageLog(String log) {
  16. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  17. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  18. sb.append(".");
  19. sb.append(stacks[1].getMethodName());
  20. sb.append("---");
  21. sb.append(log);
  22. MESSAGE_LOG.info(sb.toString());
  23. }
  24. public static void messageLog(String log, String loglevel) {
  25. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  26. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  27. sb.append(".");
  28. sb.append(stacks[1].getMethodName());
  29. sb.append("---");
  30. sb.append(log);
  31. if ("debug".equalsIgnoreCase(loglevel)) {
  32. MESSAGE_LOG.debug(log);
  33. } else if ("info".equalsIgnoreCase(loglevel)) {
  34. MESSAGE_LOG.info(log);
  35. } else if ("warn".equalsIgnoreCase(loglevel)) {
  36. MESSAGE_LOG.warn(log);
  37. } else if ("error".equalsIgnoreCase(loglevel)) {
  38. MESSAGE_LOG.error(log);
  39. } else {
  40. MESSAGE_LOG.info(log);
  41. }
  42. }
  43. public static void debugLog(String log) {
  44. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  45. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  46. sb.append(".");
  47. sb.append(stacks[1].getMethodName());
  48. sb.append("---");
  49. sb.append(log);
  50. debugPlog(sb.toString(), "debug");
  51. }
  52. public static void debugLog(String log, String loglevel) {
  53. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  54. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  55. sb.append(".");
  56. sb.append(stacks[1].getMethodName());
  57. sb.append("---");
  58. sb.append(log);
  59. debugPlog(sb.toString(), loglevel);
  60. }
  61. private static void debugPlog(String log, String loglevel) {
  62. if ("debug".equalsIgnoreCase(loglevel)) {
  63. DEBUG_LOG.debug(log);
  64. } else if ("info".equalsIgnoreCase(loglevel)) {
  65. DEBUG_LOG.info(log);
  66. } else if ("warn".equalsIgnoreCase(loglevel)) {
  67. DEBUG_LOG.warn(log);
  68. } else if ("error".equalsIgnoreCase(loglevel)) {
  69. DEBUG_LOG.error(log);
  70. } else {
  71. DEBUG_LOG.debug(log);
  72. }
  73. }
  74. public static void warnLog(String log) {
  75. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  76. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  77. sb.append(".");
  78. sb.append(stacks[1].getMethodName());
  79. sb.append("---");
  80. sb.append(log);
  81. WARN_LOG.error(sb.toString());
  82. }
  83. public static void errorLog(String log) {
  84. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  85. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  86. sb.append(".");
  87. sb.append(stacks[1].getMethodName());
  88. sb.append("---");
  89. sb.append(log);
  90. errorPLog(sb.toString(), (Throwable)null);
  91. }
  92. public static void errorLog(String log, Throwable throwable) {
  93. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  94. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  95. sb.append(".");
  96. sb.append(stacks[1].getMethodName());
  97. sb.append("---");
  98. sb.append(log);
  99. errorPLog(sb.toString(), throwable);
  100. }
  101. public static void dbLog(String log, Object... objects) {
  102. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  103. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  104. sb.append(".");
  105. sb.append(stacks[1].getMethodName());
  106. sb.append("---");
  107. sb.append(log);
  108. if (objects != null && objects.length > 0) {
  109. sb.append("; parameter[");
  110. Object[] var4 = objects;
  111. int var5 = objects.length;
  112. for(int var6 = 0; var6 < var5; ++var6) {
  113. Object obj = var4[var6];
  114. sb.append(obj);
  115. sb.append(",");
  116. }
  117. sb.delete(sb.length() - 1, sb.length());
  118. sb.append("]");
  119. }
  120. DB_LOG.debug(sb.toString());
  121. }
  122. private static void errorPLog(String log, Throwable throwable) {
  123. if (throwable == null) {
  124. ERROR_LOG.error(log);
  125. } else {
  126. ERROR_LOG.error(log, throwable);
  127. }
  128. }
  129. public static void log(String name, String log) {
  130. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  131. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  132. sb.append(".");
  133. sb.append(stacks[1].getMethodName());
  134. sb.append("---");
  135. sb.append(log);
  136. logByName(name, sb.toString(), "debug", (Throwable)null);
  137. }
  138. public static void log(String name, String log, String loglevel) {
  139. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  140. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  141. sb.append(".");
  142. sb.append(stacks[1].getMethodName());
  143. sb.append("---");
  144. sb.append(log);
  145. logByName(name, sb.toString(), loglevel, (Throwable)null);
  146. }
  147. public static void log(String name, String log, String loglevel, Throwable throwable) {
  148. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  149. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  150. sb.append(".");
  151. sb.append(stacks[1].getMethodName());
  152. sb.append("---");
  153. sb.append(log);
  154. logByName(name, sb.toString(), loglevel, throwable);
  155. }
  156. private static void logByName(String name, String log, String loglevel, Throwable throwable) {
  157. if (name != null) {
  158. StackTraceElement[] stacks = (new Throwable()).getStackTrace();
  159. StringBuffer sb = new StringBuffer(stacks[1].getClassName());
  160. sb.append(".");
  161. sb.append(stacks[1].getMethodName());
  162. sb.append("---");
  163. sb.append(log);
  164. Logger logger = LoggerFactory.getLogger(name);
  165. try {
  166. if (throwable == null) {
  167. if ("debug".equalsIgnoreCase(loglevel)) {
  168. logger.debug(log);
  169. } else if ("info".equalsIgnoreCase(loglevel)) {
  170. logger.info(log);
  171. } else if ("warn".equalsIgnoreCase(loglevel)) {
  172. logger.warn(log);
  173. } else if ("error".equalsIgnoreCase(loglevel)) {
  174. logger.error(log);
  175. } else {
  176. logger.debug(log);
  177. }
  178. } else if ("debug".equalsIgnoreCase(loglevel)) {
  179. logger.debug(log, throwable);
  180. } else if ("info".equalsIgnoreCase(loglevel)) {
  181. logger.info(log, throwable);
  182. } else if ("warn".equalsIgnoreCase(loglevel)) {
  183. logger.warn(log, throwable);
  184. } else if ("error".equalsIgnoreCase(loglevel)) {
  185. logger.error(log, throwable);
  186. } else {
  187. logger.debug(log, throwable);
  188. }
  189. } catch (Exception var8) {
  190. ;
  191. }
  192. }
  193. }
  194. }

使用说明 :

  1. // 由于该方案配置的Logger 为 sys.error...等开头,因此 直接使用loger的方式会在控制台输出,但不会被记录到日志文件之中,有且仅有通过Logit打印的日志才会被记录到文件中,此方案减少了每个类都创建loger的尴尬,非常方便
  2. Logit.errorLog("在线用户插入失败" + " parms: " + userOnline, new Throwable(e));

GITHUB链接:https://github.com/kkzhilu/volcat-server (不同分支即对应不同日志框架)

项目暂时为私有, 如果需要参考请联系我

日志套餐篇 - log4j2 logback全量套餐的更多相关文章

  1. Log4j,Log4j2,logback,slf4j日志学习

    日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条 ...

  2. Log4j,Log4j2,logback,slf4j日志学习(转)

    日志学习笔记Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条日志 ...

  3. 免费申请使用IBM Cloud Lite(轻量套餐) 续

    之前尝试申请了IBM的轻量套餐,过程很简单,操作起来也比较方便,就是能够用到的地方不多,虽说几乎是无限流量且永久免费,我能做的也只是做个小网站 免费用户默认的是轻量应用服务,如果需要功能更多更全的应用 ...

  4. 54. spring boot日志升级篇—logback【从零开始学Spring Boot】

    在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...

  5. SpringBoot系列之集成logback实现日志打印(篇二)

    SpringBoot系列之集成logback实现日志打印(篇二) 基于上篇博客SpringBoot系列之集成logback实现日志打印(篇一)之后,再写一篇博客进行补充 logback是一款开源的日志 ...

  6. 免费申请使用IBM Cloud Lite(轻量套餐) 详细教程指南

    注册轻量帐户可在 IBM CLOUD控制台中使用所选的显示有轻量标记的免费轻量套餐来构建应用程序和探索服务.轻量帐户不会到期,也无需信用卡. 本文详细的介绍了一下,免费云服务的申请以及使用!这次使用I ...

  7. 全量日志 requestId

    常量参数和系统参数 API 的请求者不可见,由网关在请求后端服务时添加上. 常量参数.比如您的后端需要接收一个常量,但是这个常量您不希望被您的客户看见,那么就设置一个常量参数,可以在 Header 或 ...

  8. iOS开发中全量日志的获取

    我们在app中对崩溃.卡顿.内存问题进行监控.一旦监控到问题,我们就需要记录下来,但是,很多问题的定位仅靠问题发生的那一刹那记录的信息是不够的,我们需要记录app的全量日志来获取更多的信息. 一,使用 ...

  9. Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...

随机推荐

  1. Elasticsearch原理入门

    这是一篇拼接贴,我是缝合怪 项目中用到了es,使用方法是挺简单的,封装了基本api以后,把查询条件封装一下传给client执行就可,但是光使用比较肤浅,研究一下原理和本质,更利于以后开发使用 扫盲贴 ...

  2. 机器学习——打开集成方法的大门,手把手带你实现AdaBoost模型

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第25篇文章,我们一起来聊聊AdaBoost. 我们目前为止已经学过了好几个模型,光决策树的生成算法就有三种.但是我们每 ...

  3. ORA-12514:监听程序无法识别

    使用plsql远程登录oracle数据库时,出现无法识别监听程序的错误.很大机率是配置文件出错. 配置文件如下: listener.ora是服务器端用的,oracle监听程序,就是读的这个文件,里面有 ...

  4. SpringBoot读取application.properties中文乱码

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 解决方案 在ID ...

  5. ElasticSearch--validate验证搜索语句是否合法或者存在语法错误

    GET /accounts/person/_validate/query?explain { "query":{ "match": { "user&q ...

  6. JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现

    1.当从服务器返回的注册错误信息的时候,我们在注册界面需要将错误信息显示出来 我们需要修改regist.jsp页面的代码:其中error是一个haspmap,c标签对map的属性可以直接使用 ${er ...

  7. android自定义控件onMeasure方法

    1.自定义控件首先定义一个类继承View 有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/ ...

  8. Python3-pymysql模块-数据库操作之MySQL

    博客转载 http://www.cnblogs.com/alex3714/articles/5950372.html 代码示例 import pymysql conn = None cursor = ...

  9. activiti学习笔记一

    activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...

  10. 入门大数据---Hadoop是什么?

    简单概括:Hadoop是由Apache组织使用Java语言开发的一款应对大数据存储和计算的分布式开源框架. Hadoop的起源 2003-2004年,Google公布了部分GFS和MapReduce思 ...