声明:迁移自本人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\testlog4j.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吧。

Windows Java桌面应用程序集成slf4j实现日志持久化的更多相关文章

  1. c#实现windows远程桌面连接程序

    c#实现windows远程桌面连接程序 使用winform制作windows远程桌面连接程序,windows自带了远程桌面连接,我们需要将远程桌面连接集成 到自己的winform程序,并实现管理远程主 ...

  2. c#实现windows远程桌面连接程序代码

    使用winform制作windows远程桌面连接程序,windows自带了远程桌面连接,我们需要将远程桌面连接集成 到自己的winform程序,并实现管理远程主机的配置. 远程桌面核心类库 windo ...

  3. 现在Java 桌面应用程序能做到什么程度(Spring Boot+JavaFX2开发)

    Spring Boot - JavaFX 2.0应用 很多人对Java开发native程序第一反应还停留在暗灰色单一风格的Java GUI界面,开发方式还停留在AWT或者Swing.本文主要基于Spr ...

  4. JAVA中使用log4j及slf4j进行日志输出的方法详解

    JAVA中输出日志比较常用的是log4j,这里讲下log4j的配置和使用方法,以及slf4j的使用方法.  一.下载log4j的架包,并导入项目中,如下: 二.创建log4j.properties配置 ...

  5. Java桌面应用程序打包

    IDEA环境生成Jar 设置配置 File -> Project Structure -> Artifacts -> + -> JAR -> From modules w ...

  6. 批处理文件指定jre路径启动java桌面应用程序

    应用场景: 我开发了一个应用程序,并连同jre一起刻成光盘,提供给用户,用户直接双击批处理文件即可运行,而不需要自己额外装jre. 目录组织结构如下: client |-images |-jre |- ...

  7. java桌面程序打包教程

    首先打包成j可执行的jar文件. . 接下来找到自己生成jar文件的路径就可以看到jar文件了,我的是在桌面: 在桌面新建一个文件夹(名字随便取,一般去项目名字) 上面是我取的文件夹名字,然后把资料文 ...

  8. Cocos2dx集成于windows桌面窗口程序的步骤

    2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...

  9. JRE“瘦身”&桌面程序集成JRE

    项目是一个桌面程序,程序文件不大,但运行jre有198 MB,因此需要"瘦身". jre包含bin.lib两部分,分别为93.6 MB.104 MB. 1.精简bin 运行桌面程序 ...

随机推荐

  1. bzoj 2451 Uyuw's Concert

    裸的半平面交.感觉这些东西,纯属在考代码能力啊.. #include<cstdio> #include<algorithm> #include<cmath> #de ...

  2. 转载-Logistic回归总结

     Logistic回归总结 作者:洞庭之子 微博:洞庭之子-Bing (2013年11月) 1.引言 看了Stanford的Andrew Ng老师的机器学习公开课中关于Logistic Regress ...

  3. 001、JAVA开发环境安装与eclipse软件第一印象

    折腾了快1个星期,一直没有成功装好JAVA环境,eclipse一直打不开,java环境配置的问题真是不得不吐槽一下,太烂了.今天反反复复折腾好久,终于搞定了.用的金山毒霸,方法如下: 一.打开金山毒霸 ...

  4. 设置进程用指定IE版本

    function IsWOW64: BOOL; begin Result := False; if GetProcAddress(GetModuleHandle(kernel32), 'IsWow64 ...

  5. 说说lock到底要锁谁?

    波安搬... http://www.cnblogs.com/wolf-sun/p/4209521.html ---------------------------------------------- ...

  6. 第二十篇ORM查询与SQL语句

    ORM查询与SQL语句 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情 ...

  7. HDFS 中文件操作的错误集锦

    问题1  Java ApI执行追加写入时:无法写入 问题描述: ①当前数据节点无法写入,②追加文件需要再次请求. 问题2  命令行执行追加写入时:无法写入 问题描述: 当前数据节点无法写入 问题3   ...

  8. Egret Engine 2D - Get Started

    Get Started     Egret 也支持在命令行完成编译,运行,发布等操作.在下面的教程中会穿插对应操作的命令行代码.   可新建游戏项目,也可建eui项目   这里包含默认的几个库,egr ...

  9. ORACLE时间相关问题

    一.遇到一个情况数据库存入的时间格式为20180831154546,需要将其转化为日期时分秒格式的. to_date('20180831154546', 'yyyy-mm-dd hh24:mi:ss' ...

  10. SQL的7种连接查询详细实例讲解

    SQL的7种连接查询详细实例讲解 原文链接:https://mp.weixin.qq.com/s/LZ6BoDhorW4cSBhaGy8VUQ 在使用数据库查询语句时,单表的查询有时候不能满足项目的业 ...