• Windows Java桌面应用程序集成slf4j实现日志持久化


    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635

    Windows上一般的应用程序也可以通过日志系统打印日志到指定文件。通过这个例子想说明,问题处理的方法是多种多样的,一种组件的应用场合也是多样的,平时slf4j日志系统多用于Web程序,其实桌面程序等一样可以使用。在真实开发自己的一个Java桌面应用的时候,这还是必须的,否则运行异常日志无法收集。System.out.println毕竟只能用于Hello World这种小的Demo程序,日志系统是现代软件的标准组件。

    本文使用的日志实现是log4j,为此需要引入3个jar,slf4j-api这个是日志门面,slf4j-log4j是沟通门面slf4j-api和log4j的桥梁,log4j中包含了具体的日志打印实现。这些jar包在maven公共仓库中都很容器找到,直接下来即可使用,或者直接创建maven工程引入这些jar包。

    1 log4j日志系统对配置文件的选择

    查看log4j-1.2.17.jar中的加载配置文件的源码LogManager.java、OptionConverter.java,可以看到如果log4j使用哪个配置文件配置日志系统由以下变量决定
    public static final String DEFAULT_CONFIGURATION_FILE = “log4j.properties”;
    static final String DEFAULT_XML_CONFIGURATION_FILE = “log4j.xml”;
    public static final String DEFAULT_CONFIGURATION_KEY = “log4j.configuration”; 优先顺序依次是:
    1)、使用环境变量log4j.configuration的值指定的配置文件,要求配置的文件是xml或者是properties文件
    2)、没有log4j.configuration指定的配置文件则使用配置文件log4j.xml
    3)、没有log4j.xml则使用配置文件log4j.properties

    2 代码实现

    step1:引入需要的jar包 在工程中引入jar包slf4j-api-1.7.7.jar、slf4j-log4j12-1.7.7.jar、log4j-1.2.17.jar 对应的maven配置如下:

    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    step2:代码实现 如果直接使用logback.xml或logback.properties,文件命名不允许变化,且文件的位置必须按规定防止,所以这里使用设置JVM变量的方式决定加载哪个配置文件。这样文件配置的灵活性好一点。

    package com.desktopapp.testslf4j;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class TestDesktopAppSlf4j
    {
        static
        {
            //指定配置文件加载路径
            System.setProperty("log4j.configuration", "file:./Prj/src/main/java/com/desktopapp/testslf4j/testlog4j.xml");
            LOGGER = LoggerFactory.getLogger(TestDesktopAppSlf4j.class);
        }
    
        public static Logger LOGGER;
    
        public static void main(String[] args)
        {
            System.out.println(System.getProperty("user.dir"));
            LOGGER.trace("this is trace log from Windows Java Desktop Application");
            LOGGER.debug("this is debug log from Windows Java Desktop Application");
            LOGGER.info("this is info log from Windows Java Desktop Application");
            LOGGER.warn("this is warn log from Windows Java Desktop Application");
            LOGGER.error("this is error log from Windows Java Desktop Application");
        }
    }

    testlog4j.xml内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration>
        <appender name="fileAppender" class="org.apache.log4j.FileAppender">
            <param name="File" value="d:/logs/testlog4j.log"/>
            <!-- 设置为true直接在源文件后面追加,设置为false覆盖原内容 -->
            <param name="Append" value="true"/>
            <param name="Threshold" value="DEBUG"/>
            <!-- 如果启用缓存,输出日志比较少的情况下不会立刻被输出 -->
            <param name="BufferedIO" value="false"/>
            <!-- 上面的BufferedIO设置为true这里才能生效 -->
            <param name="BufferSize" value="512"/>
            <layout class="org.apache.log4j.PatternLayout">
                <!-- %p表示级别,%d表示日期时间,%m表示日志输出信息,%c表示输出日志的类(使用了%l可以不写,%l已有完整类和函数信息输出),%l表示行号,%n表示换行 -->
                <param name="ConversionPattern" value="[%p] [%d{yyyy-MM-dd HH:mm:ss SSS}] [%m] [%c] [%l]%n"/>
            </layout>
        </appender>
        <root>
            <appender-ref ref="fileAppender"/>
        </root>
    </log4j:configuration>

    最后在文件D:logs estlog4j.log中的执行一次以上程序打印效果如下:

    [DEBUG] [2018-09-14 00:22:55 048] [this is debug log from Windows Java Desktop Application] [com.desktopapp.testslf4j.TestDesktopAppSlf4j] [com.desktopapp.testslf4j.TestDesktopAppSlf4j.main(TestDesktopAppSlf4j.java:21)]
    [INFO] [2018-09-14 00:22:55 051] [this is info log from Windows Java Desktop Application] [com.desktopapp.testslf4j.TestDesktopAppSlf4j] [com.desktopapp.testslf4j.TestDesktopAppSlf4j.main(TestDesktopAppSlf4j.java:22)]
    [WARN] [2018-09-14 00:22:55 051] [this is warn log from Windows Java Desktop Application] [com.desktopapp.testslf4j.TestDesktopAppSlf4j] [com.desktopapp.testslf4j.TestDesktopAppSlf4j.main(TestDesktopAppSlf4j.java:23)]
    [ERROR] [2018-09-14 00:22:55 051] [this is error log from Windows Java Desktop Application] [com.desktopapp.testslf4j.TestDesktopAppSlf4j] [com.desktopapp.testslf4j.TestDesktopAppSlf4j.main(TestDesktopAppSlf4j.java:24)] 

    log4j提供了5种Appender,分别是
    org.apache.log4j.RollingFileAppender
    org.apache.log4j.ConsoleAppender
    org.apache.log4j.FileAppender
    org.apache.log4j.DailyRollingFileAppender
    org.apache.log4j.WriterAppender
    程序中xml配置只使用了org.apache.log4j.FileAppend,其他可以根据自己的需要配置,这里就不再展开讲了。 有了以上的程序,大家应该对商用的软件怎样采集日志不会再那么神秘了吧,必要的话,放弃System.out.println吧。

  • 相关阅读:
    Android开发之旅1:环境搭建及HelloWorld
    程序员学习视频教程汇总
    Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
    查看控制层从前端传来的参数
    PostMethod和GetMethod用法
    @Transient的用法和格式化页面展示的数据格式
    修改hosts
    javascript:history.go(-1)的使用
    JsonConfig的jsonConfig.setExcludes的用法
    验证登录超时,在登录后跳转超时时的页面
  • 原文地址:https://www.cnblogs.com/xsl-thumb-rfcs/p/9941601.html
Copyright © 2020-2023  润新知