1. SpringBoot日志
写在最前面,这是改进之后的auth的日志配置,直接搬就行了。
#配置日志
logging:
file: yang/auth.log
level:
root: error
com.dev: debug
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} %logger{15} - %msg%n'
file: '%d{yyyy-MM-dd HH:mm:ss} %logger{15} - %msg%n'
(1)调整日志输出等级
由于将日志等级设置为INFO,因此包含INFO及以上级别的日志信息都会打印出来。
这里可以看出,很多大部分的INFO日志均来自于SpringBt框架本身,如果我们想屏蔽它们,可以将日志级别统一先全部设置为ERROR,这样框架自身的INFO信息不会被打印。然后再将应用中特定的包设置为DEBUG级别的日志,这样就可以只看到所关心的包中的DEBUG及以上级别的日志了。
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。
application.yml中改配置
#配置日志
logging:
level:
#基础日志的输出等级
root: error
#设置自己输出的日志等级
com.dev: debug
(2) 日志与try/catch结合
打印日志的思路,把易错的代码包裹在try/catch代码块里面,如果这里抛了异常,那么就针对try里面的错误代码,把这里面涉及到的关键信息log出来。
也就是在catch里面打印日志。
(3) 日志存储到文件
反正输出日志到文件只用file就行了,不要用path,nice!
#第一个博客的例子:
#以下相对路径,会在根目录生成 :
logging.file=myException.log
#以下是电脑的绝对路径 :
logging.file=D:/software/IdeaProjects/ideaProjectLog/myException.log
#第二个博客例子:
(在Linux下,/xxx加了一杠就是绝对路径,如果不加杠,直接xxx就是相对路径)
#相对路径
logging.file=log/my.log
#绝对路径
logging.file=/log/my.log
(4) pattern风格
#最初的完整版,可以看到yml格式要注意的就是要加两个单引号
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{15} - %msg%n'
file: '%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{15} - %msg%n'
#auth包改进之后,看一下时间,输出的类,和日志内容
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} %logger{15} - %msg%n'
file: '%d{yyyy-MM-dd HH:mm:ss} %logger{15} - %msg%n'
2. nohup输出日志
(1) 综述
这里一共有三个要输入的,一个是012,一个是>或>>,一个是文件名。
下面挨个来。
(2) 012
操作系统中有三个常用的流:
0:标准输入流 stdin
1:标准输出流 stdout(1可以省略不写)
2:标准错误流 stderr
(3) >和>>
命令 > 文件2>&1 重定向,如果文件存在,以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
命令 >> 文件2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件中
重定向就是覆盖,追加就是在后面接着写
(4) 例子
#最终的成功案例
nohup java -jar $AUTH >> ./yang/`date +%Y-%m-%d`auth.log 2>&1 &
这里面几个注意,按照时间划分的时候,没办法自动创建文件夹,只能按照时间来创建日志名。
2>&1,这个也是追加,虽然只有一个>,不过并不是覆盖。
nohup java -jar & #正常spirngboot输出
nohup java -jar -Xmx512m -Xms512m $EUREKA >/dev/null 2>&1 & #不输出日志,直接重定向到了null
这里说明了如果用nohup语句的话,他们会遵照springboot的设置,不过这个语句后面不加输出的话没办法写成shell脚本。
而第二句,麻烦的地方也就是>/dev/null 2>&1
,这句最终的效果是不输出日志。一个是1(标准输出)重定向到null,一个是2(错误输出)重定向到null,&1只是一个指代。
(5) 查看日志
vim xxxx.log
然后进入那个界面之后
gg 回到第一行
G(shift + g) 跳到最后一行
2. 如何快速地生成日志
- 用logf生成private static final logger
(1) 在live template中新增名为logs的template group,然后新增live template
(2) abbreviation填入自己喜欢的缩写,我里是logf
(3) Applicable context选择statement&expression&declaration,点击蓝色的change
(4) Template text输入
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger($CLASS_NAME$.class);
(5) 点击Edit variable 设置被$$包裹的参数的值,这里
CLASSNAME 设置为 className()
(6) apply–>OK结束,输入logf +回车即可打印声明log对象
- 用logp快速生成输出方法和参数
(1) 新增一个live template,缩写随意,我这里用logp。
logger.info("$METHOD_PAXKAGE$-->$METHOD_NAME$::$PLACE_HOLDERS$",$ARGUMENTS$);
(2) 参数设置:
PLACE_HOLDERS = groovyScript("_1.collect { it + ' = [{}]'}.join(', ') ", methodParameters())
ARGUMENTS = groovyScript("_1.collect { it }.join(', ') ", methodParameters())
METHOD_NAME = methodName()
METHOD_PAXKAGE = currentPackage()
(3) Apply --> OK 效果如下:
输入 logp+回车
3. 与输出日志相关的插件
(1) GrepConsole
这个只能改变前景背景色,而且是根据日志的等级,如果是自定义的输出基本都是一个等级,没办法区分的,所以用处不大。
(2) MyBatis Log Plugin
运行到mapper的时候,可以把sql语句和查询的输入变量也打印出来,很有用
4. 尚硅谷日志教学
(1)日志框架的种类
日志的门面就是一个日志的抽象层,后面的具体实现无论改版都少次,反正都能兼容就行了。
抽象层:
JCL,上次更新已经是2014年了,太老
jboss,是给一些特定框架用的
具体实现层:
Log4j是一个很好的实现,但后来有性能问题
这个作者后来又升级,SLF4j的抽象层和Logback这个升级版都是一个作者写的,所以同时用这两个肯定是不错的。
Log4j2是Apache出的新的日志框架,只是借了Log4j的名字,其实写的不错,就是很多框架还没兼容。
(2)抽象框架往下的兼容
如果用SLF4J的抽象层,调用具体层的话,logback和SLF4J都是一个人写的,完美兼容,啥也不用。
log4j太早了,写的时候还没考虑到抽象层的事情,所以调用抽象层,抽象层再调用适配器,适配器去调用实现层代码。导入jar包的时候,多导入一个适配器的包。
(3)各家的各种日志框架统一的原理
Spring、Mybatis、Hibernate这些都有自己的日志框架,怎么统一到SLF4J上面就是个问题。
解决方法是把它们调用的那个日至包换掉,换成一个适配器类型的包,和原来的包结构完全一样,然后像之前一样,调现在导入的这个包,然后调用SLF4J,再调用实现层。
(4) 引入依赖
新建的Spring Boot项目一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging的依赖,所以,无需额外添加依赖。
5. 教学中最有用的两点
(1)日志输出的格式
(这格式基本上,日志时间、Service名、日志内容)
logging.level.com.atguigu=trace
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
‐‐>
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n