OSGI整合日志slf4j、log4j、log4j2、logback
方案一:slf4j+ logback
1. 说明
slf4j-api、logback-classic、logback-core,默认支持OSGI服务规范,可以直接使用这些服务
2. 部署与配置
- 将slf4j-api-1.7.25.jar、logback-classic-1.2.3.jar、logback-core-1.2.3.jar 放在 felix 自动启动 bundle 目录下
- Felix/conf/system.properties 中配置 logback.xml的文件路径 logback.configurationFile=./conf/logback.xml
- 配置logback.xml文件
<configuration scan="true" scanPeriod="10 seconds">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${user.home}/felix/logs" />
<!-- defined a console append -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] [%X{id}] [%X{pid}] %c{1}:%L - %msg%n</pattern>
</encoder>
</appender>
<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/manis.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/manis-%d{yyyyMMdd}.%i.log</fileNamePattern>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
<!--单个文件大小-->
<maxFileSize>10MB</maxFileSize>
<!--所有日志文件超过指定值时删除历史-->
<totalSizeCap>20GB</totalSizeCap>
<!--清理历史日志开关-->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level表级别从左显示5个字符宽度,%X{id表流水号,%X{pid表流程编号,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] [%X{id}] [%X{pid}] %c{1}:%L - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成监控文件 -->
<appender name="MONI_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/manis.lst</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/manis-%d{yyyyMMdd}.%i.lst</fileNamePattern>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
<!--单个文件大小-->
<maxFileSize>10MB</maxFileSize>
<!--所有日志文件超过指定值时删除历史-->
<totalSizeCap>20GB</totalSizeCap>
<!--清理历史日志开关-->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%msg</pattern>
</encoder>
</appender>
<logger name="com.ccb.platform.manis.extra.core.lb.BalanceUtils" level="ERROR" additivity="false">
<appender-ref ref="LOG_FILE" />
</logger>
<logger name="com.ccb.platform.manis.io.ctrl.IoCtrlMoniterLog" level="DEBUG" additivity="false">
<appender-ref ref="MONI_FILE" />
</logger>
<!-- log all Bundle events -->
<logger name="Events.Bundle" level="TRACE"/>
<!-- log WARN Framework service events of bundles whose BSN starts with `org.eclipse.osgi` (guess who that is?) -->
<logger name="Events.Service.org.eclipse.osgi" level="WARN"/>
<!-- turn OFF legacy Log Service records from bundles whose BSN starts with `org.baz` -->
<logger name="LogService.org.baz" level="OFF"/>
<!-- log DEBUG Service events for bundles whose BSN starts with `org.fum` -->
<logger name="Events.Service.org.fum" level="DEBUG"/>
<!-- log DEBUG from any log API using a logger name starting with `org.my.foo` -->
<logger name="org.my.foo" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="LOG_FILE" />
</root>
</configuration>
3. 业务模块
-
引入pom
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> <scope>provided</scope> </dependency>
-
osgi 配置
<Import-Package> ... org.slf4j, ... </Import-Package>
-
打印日志
// 引入包: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; //定义成员变量 private static Logger logger = LoggerFactory.getLogger(Activator.class); //打印日志 MDC.put("id","MDC-123456789"); logger.info("info msg"); logger.warn("warn msg"); logger.error("test error",new RuntimeException("test error")); MDC.clear();
注意事项:方案一,无法打印 MDC put 的变量,类名、方法名称、行号 , 方案二,无法打印 bundle 名称,可以使用MDC put
推荐使用方案二
方案二:log4j
1. 说明
与logback类似,log4j 默认也支持osgi服务规范
2. 部署与配置
-
将log4j-1.2.17.jar 包放在bundle 的自动启动目录下 ,该包可以在maven中找到
-
在Felix/conf/system.properties中配置log4j.xml配置文件路径
log4j.configuration=file:/home/felix/felix-framework-7.0.0/conf/log4j.xml
-
编写log4j.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="OutConsoleLog" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[EJX4]%m \t\t|| [%l][%d{yyyy-MM-dd HH:mm:ss SSS}][%-5p]%n"/>
</layout>
</appender>
<appender name="ErrConsoleLog" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="error"/>
<param name="target" value="System.err"/>
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[EJX4-WARN]%m \t\t|| [%l][%d{yyyy-MM-dd HH:mm:ss SSS}][%-5p]%n"/>
</layout>
</appender>
<appender name="FileLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Encoding" value="UTF-8"/>
<param name="Append" value="true"/>
<param name="file" value="./applogs/test.log"/>
<param name="BufferedIO" value="false"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%X{id}] %m[%c:%L]%n"/>
</layout>
</appender>
<root>
<priority value="INFO"/>
<appender-ref ref="ErrConsoleLog"/>
<appender-ref ref="OutConsoleLog"/>
<appender-ref ref="FileLog"/>
</root>
</log4j:configuration>
3.业务模块
-
maven引入sl4j包
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>provided</scope> </dependency>
-
osgi 配置
<Import-Package> ... org.apache.log4j, ... </Import-Package>
-
代码使用
// 引入包 import org.apache.log4j.Logger; import org.apache.log4j.MDC; //定义成员变量中 private static Logger logger = Logger.getLogger(Activator.class); //方法使用 MDC.put("id","MDC-123456789"); logger.info("info msg"); logger.warn("warn msg"); logger.error("test error",new RuntimeException("test error")); MDC.clear();
方案三:slf4j+log4j
1. 说明
slf4、log4j 本身都支持osgi服务规范
2. 部署与配置
-
将slf4j-api-1.7.25.jar、slf4j-log4j12-1.7.25.jar、log4j-1.2.17.jar 放入bundle 目录中
-
在Felix/conf/system.properties中配置log4j.xml配置文件路径
log4j.configuration=file:/home/felix/felix-framework-7.0.0/conf/log4j.xml
-
编写log4j.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="OutConsoleLog" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[EJX4]%m \t\t|| [%l][%d{yyyy-MM-dd HH:mm:ss SSS}][%-5p]%n"/>
</layout>
</appender>
<appender name="ErrConsoleLog" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="error"/>
<param name="target" value="System.err"/>
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[EJX4-WARN]%m \t\t|| [%l][%d{yyyy-MM-dd HH:mm:ss SSS}][%-5p]%n"/>
</layout>
</appender>
<appender name="FileLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Encoding" value="UTF-8"/>
<param name="Append" value="true"/>
<param name="file" value="./applogs/test.log"/>
<param name="BufferedIO" value="false"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%X{id}] %m[%c:%L]%n"/>
</layout>
</appender>
<root>
<priority value="INFO"/>
<appender-ref ref="ErrConsoleLog"/>
<appender-ref ref="OutConsoleLog"/>
<appender-ref ref="FileLog"/>
</root>
</log4j:configuration>
3. 业务模块
-
引入pom
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> <scope>provided</scope> </dependency>
-
osgi 配置
<Import-Package> ... org.slf4j, ... </Import-Package>
-
打印日志
// 引入包: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; //定义成员变量 private static Logger logger = LoggerFactory.getLogger(Activator.class); //打印日志 MDC.put("id","MDC-123456789"); logger.info("info msg"); logger.warn("warn msg"); logger.error("test error",new RuntimeException("test error")); MDC.clear();
方案:slf4j+log4j2
1. 说明
slf4、log4j2 本身都支持osgi服务规范
2. 部署与配置
-
将slf4j-api-1.7.25.jar、log4j-slf4j-impl-2.11.2.jar、log4j-api-2.11.2.jar、log4j-core-2.11.2.jar 放入bundle 目录中
-
在Felix/conf/system.properties中配置log4j.xml配置文件路径
log4j2.configurationFile=./conf/log4j2.xml
-
编写log4j2.xml 文件
<?xml version="1.0"?>
<configuration status="WARN" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
</console>
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} [%X{id}] %L %M - %msg%xEx%n"/>
</File>
<RollingFile name="RollingFileInfo" fileName="logs/info.log"
filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="logs/warn.log"
filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="logs/error.log"
filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
3. 业务模块
-
引入pom
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> <scope>provided</scope> </dependency>
-
osgi 配置
<Import-Package> ... org.slf4j, ... </Import-Package>
-
打印日志
// 引入包: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; //定义成员变量 private static Logger logger = LoggerFactory.getLogger(Activator.class); //打印日志 MDC.put("id","MDC-123456789"); logger.info("info msg"); logger.warn("warn msg"); logger.error("test error",new RuntimeException("test error")); MDC.clear();
方案六:log4j2
1. 说明
log4j2 本身都支持osgi服务规范
2. 部署与配置
-
将log4j-api-2.11.2.jar、log4j-core-2.11.2.jar 放入bundle 目录中
-
在Felix/conf/system.properties中配置log4j.xml配置文件路径
log4j2.configurationFile=./conf/log4j2.xml
-
编写log4j2.xml 文件
<?xml version="1.0"?>
<configuration status="WARN" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
</console>
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} [%X{id}] %L %M - %msg%xEx%n"/>
</File>
<RollingFile name="RollingFileInfo" fileName="logs/info.log"
filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="logs/warn.log"
filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="logs/error.log"
filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] [%X{id}] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
3. 业务模块
-
引入pom
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.2</version> <scope>provided</scope> </dependency>
-
osgi 配置
<Import-Package> ... org.apache.logging.log4j, ... </Import-Package>
-
打印日志
// 引入包: import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext; //定义成员变量 private static final Logger logger = LogManager.getLogger(Activator.class); //打印日志 ThreadContext.put("id","MDC-123456789"); logger.info("info start 11"); logger.warn("warn start 11"); logger.error("test error",new RuntimeException("test error")); ThreadContext.clearMap();