slf4j使用的辛酸历程

在官方下载了最新https://www.slf4j.org/download.html

Window系统选择了zip的文件

解压后有很多包

使用教程:https://www.yiibai.com/slf4j/slf4j_environment_setup.html

slf4j-api-1.7.28.jar包必须有

日志框架可以选择一个,如下图

选择slf4j-log4j12-1.7.28.jar 这个包,说明上提示还要使用 log4j.jar,看官方slf4j的解压包里库,以为log4j-over-slf4j-1.7.28.jar库就是所谓的log4j.jar

然后使用,结果 slf4j冲突

Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path

参考https://www.slf4j.org/legacy.html

于是将log4j-over-slf4j-1.7.28.jar库移除

结果异常Failed to instantiate SLF4J LoggerFactory 

参考:http://www.it1352.com/973678.html 说少了log4j.jar库

于是又单独搜log4j.jar

找到了apache官网http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip

下载了最新的

解压后将最新的log4j-1.2.17.jar加入库

结果又出现

log4j:WARN No appenders could be found for logger (TestPubFun).
log4j:WARN Please initialize the log4j system properly.

这个时候网上说要配置log4j.properties或者log4j.xml

参考:http://www.mamicode.com/info-detail-1108072.html

结果配置log4j.properties不起作用,采用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="myConsole" class="org.apache.log4j.ConsoleAppender">       
        <layout class="org.apache.log4j.PatternLayout">   
            <!-- %d表示日期,后面为日期格式 %c 为资源名称(类名)替代符 %c{2}为a.b.c显示b.c --> 
            <!-- %m 表示消息体  %n 为换行符 %p日志的优先级 %t 产生该日志事件的线程名 %l日志输入位置 %L日志输入行数--> 
            <param name="ConversionPattern"          
                value="日期:%d{yyyy/MM/dd HH:mm:ss,SSS\} 日志类型:%-5p 线程:[%t] 对象:%c{2\} - 日志内容:%m%n" />       
        </layout>       
        <!--过滤器设置输出的级别-->       
        <filter class="org.apache.log4j.varia.LevelRangeFilter">    
         	<!-- info,error debug,error信息打在控制台 -->         
            <param name="levelMin" value="info" />       
            <param name="levelMax" value="error" />       
            <param name="AcceptOnMatch" value="true" />       
        </filter>       
    </appender>       
    <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
    <appender name="logifno" class="org.apache.log4j.RollingFileAppender">
    	<param name="Encoding" value="UTF-8" />
    	<!-- 设置日志输出文件名 --> 
        <param name="File" value="${logbase}/infos/info.log" />      
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->       
        <param name="Append" value="true" />  
         <!-- 设置保存备份回滚日志的最大个数 -->
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">       
        <param name="ConversionPattern" 
        value="日期:%d{yyyy/MM/dd HH:mm:ss,SSS\}%n日志类型:%-5p%n线程:[%t]%n对象:%c{2\}%n%l%n日志内容:%m%n%n"  />       
        </layout>      
          <filter class="org.apache.log4j.varia.LevelRangeFilter">       
            <param name="levelMin" value="info" />       
            <param name="levelMax" value="info" />  
            <!-- 在区间范围内才匹配 -->
            <param name="AcceptOnMatch" value="true" />       
        </filter>   
    </appender>
    <!-- 配置程序运行时的日志输出,输出到文件,并且文件按天存放 -->
    <appender name="logerr" class="org.apache.log4j.DailyRollingFileAppender">
    	<param name="Encoding" value="UTF-8" />
    	<!-- 设置日志输出文件名 --> 
        <param name="File" value="${logbase}/log/err.log" />    
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->       
        <param name="Append" value="true" />       
        <!-- 当天日志保存到log.log文件,前一天的日志文件名将被修改为#log.log + .yyyyMMdd.log -->   
        <param name="DatePattern" value="'.'yyyyMMdd'.log'" />              
        <layout class="org.apache.log4j.PatternLayout">       
        <param name="ConversionPattern" 
        value="日期:%d{yyyy/MM/dd HH:mm:ss,SSS\}%n日志类型:%-5p%n线程:[%t]%n对象:%c{2\}%n%l%n日志内容:%m%n%n"  />       
        </layout>      
          <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
          	 <!-- error 信息 -->      
            <param name="levelMin" value="error" />       
            <param name="levelMax" value="error" />  
            <!-- 在区间范围内才匹配 -->
            <param name="AcceptOnMatch" value="true" />       
        </filter>   
    </appender>
     <logger name="org.elasticsearch.client.transport">
     	<!-- info、debug、error、warn -->
		<level value="debug" />
	</logger>
	
    <!-- 根logger的设置-->       
    <root>       
        <priority value ="debug"/>       
        <appender-ref ref="myConsole"/>       
        <appender-ref ref="logifno"/>  
        <appender-ref ref="logerr"/>         
    </root>       
</log4j:configuration>  

配置logger时

WARN 元素类型为 "logger" 的内容必须匹配 "(param*,level?,appender-ref*)"

 logger节点配置两个以上,有一个additivity="false"里设定appender-ref 节点时,异常消失

 

然后日志打印出来了

要将日志写在相对路径下,如上配置代码(注意\,如果写/ 可能logbase失效)

 <param name="File" value="${logbase}\log\err.log" />     

java 代码设定logbase对应的目录

protected static Logger logger = LoggerFactory.getLogger(TestPubFun.class);

String rootPath = PubFile.GetAppPath();
		System.setProperty("logbase",rootPath);
		logger.debug(rootPath);

//其中PubFile的方法
public class PubFile {
	
	/*
	 * 获取当前运行程序的完整目录
	 */
	public static String GetAppPath() {
		return System.getProperty("user.dir");
	}

 以下为slf4j简单的封装

package pubFuns;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogHelper {
	/**
	 * 日志的路径,程式运行路径
	 */
	private static String LogPath="";

	/**
   	 * 获取适配日志器,供内部调用
	 * 设定日志路径	
	 * @param className 一般为类名*.class.getName(),其他任意字符串也可以
	 * 主要用于区分日志来源
	 * @return
	 */
	private static Logger getLogger(String className) {	
		if(LogPath=="")
		{
			LogPath = System.getProperty("user.dir");//运行地址
			System.setProperty("logbase",LogPath);
		}
		return LoggerFactory.getLogger(className);
	}

	/**
	 * 打印日志 控制台
	 * @param className
	 * @param msg
	 */
	public static void WriteDebug(String className,String msg) {
		Logger logDebug=getLogger(className);
		if(logDebug.isDebugEnabled())
		{
			logDebug.debug(msg);
		}
	}
	/**
	 * 写异常日志,日志文件为应用启动路径下log文件夹下
	 * @param className
	 * @param msg
	 */
	public static void WriteError(String className,String msg) {
		Logger logError=getLogger(className);
		if(logError.isErrorEnabled())
		{
			logError.error(msg);
		}
	}
	
	/**
	 * 写信息日志文件,,日志文件为应用启动路径下Info文件夹下
	 * @param className
	 * @param msg
	 */
	public static void WriteInfo(String className,String msg) {
		Logger logInfor=getLogger(className);
		if(logInfor.isInfoEnabled())
		{
			logInfor.info(msg);
		}
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值