日志:Log
作用
- 开发时输出的信息,有助于查看各种信息
- 生产环境里,日志记下来,有助于定位错误
内容
- 方法执行提示,参数的信息,返回值的信息
- 操作日志,记录用户操作信息,用于产品运营,如基于大数据的推荐
目前的常用开源日志包
- log4j:一个抽象的日志包,可以在buildpath中自动选择相应的日志包
- lockback
- sl4j:无论底层是什么日志包都能用
log4j和logback互斥,只能选用其中一个
logback的使用
为类添加日志
//标配,为参数对应的类加入日志
public final static Logger logger = LoggerFactory.getLogger(this.class);
xml配置
如果在类路径上找到logback-test.xml或logback.xml文件,则logback将尝试使用logback-test.xml或logback.xml文件进行自我配置
基本配置文件
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
appender注明日志输出的位置,STDOUT意为standard OUT(标准输出设备),class属性为输出位置,如此处ConsoleAppender为输出到控制台
encoder中的pattern为输出格式,即:时间+线程+级别+类名+信息
root中level属性表示根级别,如此处根级别为debug,则高于debug的级别通过STDOUT输出
结论
开发阶段使用debug,生产阶段使用info
使用debug:warn、debug、info、error这些级别的日志有效
使用info:warn、info、error这些级别的日志有效
方法的参数用debug,进入方法的信息使用info
关于logback无法打印mybatis日志的问题
尝试用logback+slf4j打印mybatis日志信息,却始终无法打印,而自己用logger定义的日志信息可以打印出来,logback.xml如下:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
后来通过搜索,得到一个解决办法解决办法原帖连接
在logback.xml中加入:
<logger name="org.apache.ibatis" level="DEBUG">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="java.sql" level="debug">
<appender-ref ref="STDOUT"/>
</logger
在mybatis-config.xml中加入;
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
的方法,可以成功打印出mybatis的日志信息:
但是这里有一个问题,这里打印出的仅仅是mybatis的日志信息,而logback.xml中配置格式时,还有时间、线程等信息,于是查询了mybatis官方文档发现,STDOUT_LOGGING应该是mybatis的一个日志实现,也就是说,这种方法与logback并无关系,于是我将logback.xml删除,甚至是将slf4j和logback的jar包都移除了日志文件还是照常输出
## 结论
目前mybatis内置的日志工厂没有logback,所以不会检测到logback的jar包,会禁用日志功能
2021.4.16,今天写thymeleaf时惊奇的发现,控制台将mybatis的日志输出了,而我用的还是logback,想到thymeleaf中有一个slf4j的jar包,
之前我所用的slf4j是1.7.9版本的,可能与我的logbackjar包的版本不兼容,所以出现日志无法打印的情况
结论
logback1.2.3与slf4j1.7.9的版本不兼容,出现日志无法打印的情况,改为其他可兼容版本如1.7.25即可
mybatis日志—Mapper文件的sql语句中,参数用${}和用#{}的差别
当用${}时,日志中的sql语句会将sql的参数值直接显示在语句中,而#{}则显示预编译时的sql语句,即将参数用?代替
#{}:
${}: