OSGI整合日志slf4j、log4j、log4j2、logback

本文详细介绍了在OSGI环境中整合多种日志框架的方案,包括slf4j+logback、log4j、slf4j+log4j、slf4j+log4j2以及log4j2。每个方案都包含了配置说明、部署步骤和业务模块的日志使用方法,涉及日志输出、文件滚动策略和不同级别的日志记录。
摘要由CSDN通过智能技术生成

方案一:slf4j+ logback
1. 说明

slf4j-api、logback-classic、logback-core,默认支持OSGI服务规范,可以直接使用这些服务

2. 部署与配置
  1. 将slf4j-api-1.7.25.jar、logback-classic-1.2.3.jar、logback-core-1.2.3.jar 放在 felix 自动启动 bundle 目录下
  2. Felix/conf/system.properties 中配置 logback.xml的文件路径 logback.configurationFile=./conf/logback.xml
  3. 配置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. 业务模块
  1. 引入pom

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
                <scope>provided</scope>
            </dependency>
    
  2. osgi 配置

                           <Import-Package>
                               ...
                                org.slf4j,
                               ...
                            </Import-Package>
    
  3. 打印日志

    // 引入包:
    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. 部署与配置
  1. 将log4j-1.2.17.jar 包放在bundle 的自动启动目录下 ,该包可以在maven中找到

  2. 在Felix/conf/system.properties中配置log4j.xml配置文件路径

    log4j.configuration=file:/home/felix/felix-framework-7.0.0/conf/log4j.xml
    
  3. 编写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.业务模块
  1. maven引入sl4j包

            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
                <scope>provided</scope>
            </dependency>
    
  2. osgi 配置

                           <Import-Package>
                               ...
                                org.apache.log4j,
                               ...
                            </Import-Package>
    
  3. 代码使用

    // 引入包
    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. 部署与配置
  1. 将slf4j-api-1.7.25.jar、slf4j-log4j12-1.7.25.jar、log4j-1.2.17.jar 放入bundle 目录中

  2. 在Felix/conf/system.properties中配置log4j.xml配置文件路径

    log4j.configuration=file:/home/felix/felix-framework-7.0.0/conf/log4j.xml
    
  3. 编写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. 业务模块
  1. 引入pom

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
                <scope>provided</scope>
            </dependency>
    
  2. osgi 配置

                           <Import-Package>
                               ...
                                org.slf4j,
                               ...
                            </Import-Package>
    
  3. 打印日志

    // 引入包:
    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. 部署与配置
  1. 将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 目录中

  2. 在Felix/conf/system.properties中配置log4j.xml配置文件路径

    log4j2.configurationFile=./conf/log4j2.xml
    
  3. 编写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. 业务模块
  1. 引入pom

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
                <scope>provided</scope>
            </dependency>
    
  2. osgi 配置

                           <Import-Package>
                               ...
                                org.slf4j,
                               ...
                            </Import-Package>
    
  3. 打印日志

    // 引入包:
    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. 部署与配置
  1. 将log4j-api-2.11.2.jar、log4j-core-2.11.2.jar 放入bundle 目录中

  2. 在Felix/conf/system.properties中配置log4j.xml配置文件路径

    log4j2.configurationFile=./conf/log4j2.xml
    
  3. 编写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. 业务模块
  1. 引入pom

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.11.2</version>
                <scope>provided</scope>
            </dependency>
    
  2. osgi 配置

                           <Import-Package>
                               ...
                                org.apache.logging.log4j,
                               ...
                            </Import-Package>
    
  3. 打印日志

    // 引入包:
    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();
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值