在官方下载了最新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);
}
}
}