当前位置: 首页 > 科技观察

你知道如何在Springboot生产环境中动态修改日志级别吗?

时间:2023-03-13 16:13:02 科技观察

项目运行时,需要打印更详细的日志信息,不想修改配置文件再重启服务。有没有办法在不直接修改配置重启服务的情况下控制日志级别呢?是的,如果你了解SpringBootAdmin,你应该知道它提供了动态切换日志级别的功能。本文将带你了解不用SpringBootAdmin动态实现日志切换的功能。测试控制器包com.pack.logger.change_level@RestController@RequestMapping("/logger")公共类LoggerLevelChangeController{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(LoggerLevelChangeController.class);@GetMapping("/print")publicObjectprint(){logger.info("ThisisInfologger...");logger.debug("这是调试记录器...");返回“打印”;在配置文件logging中为这个包配置日志级别:level:'[com.pack.logger.change_level]':INFOtest2023-01-1016:29:59.012INFO66436---[nio-8082-exec-5]c.p.l.c.LoggerLevelChangeController:这是信息记录器。..com.pack.logger.change_level包当前配置的日志级别是INFO,所以这里输出info级别的日志信息。当级别调整为DEBUG时,控制台会输出INFO和DEBUG的日志信息,我们这里修改后需要重启服务。接下来我们看看如何在不重启服务的情况下动态调整日志级别。修改日志级别然后我们在上面的Controller中添加如下方法@GetMapping("/level")publicObjectchangeLevel(Stringlevel){LoggingSystemsystem=LoggingSystem.get(LoggingSystem.class.getClassLoader());//第一个参数指定你需要设置的logger的名称//第二个参数将通过接口传入的level转换为LogLevel,然后设置system.setLogLevel("com.pack.logger.change_level",resolveLogLevel(等级));return"changeloggerlevelsuccess";}privateLogLevelresolveLogLevel(Stringlevel){StringtrimmedLevel=level.trim();returnLogLevel.valueOf(trimmedLevel.toUpperCase(Locale.ENGLISH));}通过LogginSystem对象设置日志级别。测试将日志级别设置为调试,然后方法以上打印界面,控制台输出:2023-01-1016:38:40.490INFO66436---[nio-8082-exec-9]c.p.l.c.LoggerLevelChangeController:ThisisInfologger...2023-01-1016:38:40.490DEBUG66436---[nio-8082-exec-9]c.p.l.c.LoggerLevelChangeController:ThisisDebuglogger...日志级别切换成功,如果你在服务重新启动也将无效。修改整个系统的日志级别上面的例子只是设置了指定logger的名称。如果要调整整个系统的日志级别,可以使用下面的方法://修改上面的changeLevel方法//要设置的日志记录logger的名称也是通过参数@GetMapping传递的("/level")publicObjectchangeLevel(Stringname,Stringlevel){LoggingSystemsystem=LoggingSystem.get(LoggingSystem.class.getClassLoader());//如果传入的logger名称是root,则将其设置为nullif(name.equalsIgnoreCase("root")){name=null;}//只要把name设置为null,整个系统的level就会一起调整system.setLogLevel(name,resolveLogLevel(level));return"changeloggerlevelsuccess";}测试:将root日志级别更改为debug2023-01-1016:48:15.244DEBUG50544---[nio-8082-exec-6]o.a.coyote.http11.Http11InputBuffer:在fill()之前:parsingHeader:[true],parsingRequestLine:[true],parsingRequestLinePhase:[0],parsingRequestLineStart:[0],byteBuffer.position():[0],byteBuffer.limit():[0],结束:[1166]2023-01-1016:48:15.244DEBUG50544---[nio-8082-exec-6]o.a.tomcat.util.net.SocketWrapperBase:套接字:[org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@619d8bee:org.apache.tomcat.util.net.NioChannel@38066775:java.nio.channels.SocketChannel[已连接本地=/0:0:0:0:0:0:0:1:8082远程=/0:0:0:0:0:0:0:1:59173]],从缓冲区读取:[0]2023-01-1016:48:15.244DEBUG50544---[nio-8082-exec-6]org.apache.tomcat.util.net.NioEndpoint:套接字:[org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@619d8bee:org.apache.tomcat.util.net.NioChannel@38066775:java.nio.channels。SocketChannel[connectedlocal=/0:0:0:0:0:0:0:1:8082remote=/0:0:0:0:0:0:0:1:59173]],直接从套接字读取:[1166]2023-01-1016:48:15.244DEBUG50544---[nio-8082-exec-6]o.a.coyote.http11.Http11InputBuffer:收到[GET/logger2/printHTTP/1.1Host:localhost:8082Connection:keep-aliveCache-Control:max-age=0sec-ch-ua:"Not?A_Brand";v="8","Chromium";v="108","GoogleChrome";v="108"sec-ch-ua-mobile:?0sec-ch-ua-platform:"Windows"Upgrade-Insecure-Requests:1User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/108.0.0.0Safari/537.36Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site:noneSec-Fetch-Mode:navigateSec-Fetch-User:?1Sec-Fetch-Dest:documentAccept-Encoding:gzip,deflate,brAccept-Language:zh-CN,zh;q=0.9Cookie:rememberMe=true;会话=YzQ4NTBkOTQtN2EzYi00YWNjLTk0ZmItZTBmYWVlNGJiNDUx;用户名=管理员;大小=小;侧边栏状态=1;密码=KfhG4ggUsr1BSTaK5EMdiKhM+5GWwmRl9agleoPd4kaDAjpntUNu81ogBYVblALKNf9uqqnY+vEmCpY0ALWuyw==;Admin-Token=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijk0MGEwZmVhLWY2NWMtNGRmNy1hMDhhLWMxZDRhMDBkODZmOSJ9.r4syG-ZXBwOre2p6CDpIqaBePZuzPHFjako6oGXUejqxzxAoHA70Ov5bwmqJ9WB-rnwPQx-QSKxLJKDcgfBKdw;JSESSIONID=862D0514B6BDF558E299783289188AB9]2023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]o.a.t.util.http.Rfc6265CookieProcessor:Cookies:解析b[]:rememberMe=true;塞西ON=YzQ4NTBkOTQtN2EzYi00YWNjLTk0ZmItZTBmYWVlNGJiNDUx;用户名=管理员;大小=小;侧边栏状态=1;密码=KfhG4ggUsr1BSTaK5EMdiKhM+5GWwmRl9agleoPd4kaDAjpntUNu81ogBYVblALKNf9uqqnY+vEmCpY0ALWuyw==;Admin-Token=eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijk0MGEwZmVhLWY2NWMtNGRmNy1hMDhhLWMxZDRhMDBkODZmOSJ9.r4syG-ZXBwOre2p6CDpIqaBePZuzPHFjako6oGXUejqxzxAoHA70Ov5bwmqJ9WB-rnwPQx-QSKxLJKDcgfBKdw;JSESSIONID=862D0514B6BDF558E299783289188AB92023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]o.a.catalina.connector.CoyoteAdapter:Requestedcookiesessionidis862D0514B6BDF558E299783289188AB92023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]o.a.c.authenticator.AuthenticatorBase:安全检查请求GET/logger2/print2023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]org。apache.catalina.realm.RealmBase:未定义适用的约束2023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]o.a.c.authenticator.AuthenticatorBase:不受任何约束2023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]org.apache.tomcat.util.http.Parameters:将编码设置为UTF-82023-01-1016:48:15.245DEBUG50544---[nio-8082-exec-6]o.s.web.servlet.DispatcherServlet:获取“/logger2/print”,参数={}2023-01-1016:48:15.246DEBUG50544---[nio-8082-exec-6]s.w.s.m.m.a.RequestMappingHandlerMapping:映射到com.pack.logger.change_level.LoggerController#print()2023-01-1016:48:15.246INFO50544---[nio-8082-exec-6]c.p.l.change_level.LoggerController:这是信息记录器...2023-01-1016:48:15.246错误50544---[nio-8082-exec-6]c.p.l.change_level.LoggerController:这个是错误记录器...2023-01-1016:48:15.246DEBUG50544---[nio-8082-exec-6]m.m.a.RequestResponseBodyMethodProcessor:使用'text/html',给定[text/html,application/xhtml+xml,image/avif,image/webp,image/apng,application/xml;q=0.9,application/signed-exchange;v=b3;q=0.9,*/*;q=0.8]并支持[text/plain,*/*,text/plain,*/*,application/json,application/*+json,application/json,application/*+json]2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]m.m.a.RequestResponseBodyMethodProcessor:写入["print"]2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]o.s.web.servlet.DispatcherServlet:Completed200OK2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]o.a.coyote.http11.Http11InputBuffer:在fill()之前:parsingHeader:[true],parsingRequestLine:[true],parsingRequestLinePhase:[0],parsingRequestLineStart:[0],byteBuffer.position():[0],byteBuffer.limit():[0],结束:[1166]2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]o.a.tomcat.util.net.SocketWrapperBase:套接字:[org.apache。tomcat.util.net.NioEndpoint$NioSocketWrapper@619d8bee:org.apache.tomcat.util.net.NioChannel@38066775:java.nio.channels.SocketChannel[连接本地=/0:0:0:0:0:0:0:1:8082remote=/0:0:0:0:0:0:0:1:59173]],从缓冲区读取:[0]2023-01-1016:48:15.247调试50544---[nio-8082-exec-6]org.apache.tomcat.util.net.NioEndpoint:套接字:[org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@619d8bee:org.apache.tomcat.util.net.NioChannel@38066775:java.nio.channels.SocketChannel[连接本地=/0:0:0:0:0:0:0:1:8082远程=/0:0:0:0:0:0:0:1:59173]],直接从套接字读取:[0]2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]o.a.coyote.http11。Http11InputBuffer:收到[]2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]o.apache.coyote.http11.Http11Processor:套接字:[org.apache.tomcat.util。net.NioEndpoint$NioSocketWrapper@619d8bee:org.apache.tomcat.util.net.NioChannel@38066775:java.nio.channels.SocketChannel[连接本地=/0:0:0:0:0:0:0:1:8082remote=/0:0:0:0:0:0:0:1:59173]],状态:[OPEN_READ],状态输出:[OPEN]2023-01-1016:48:15.247DEBUG50544---[nio-8082-exec-6]org.apache.tomcat.util.net.NioEndpoint:注册阅读兴趣[org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@619d8bee:org.apache.tomcat.util.net.NioChannel@38066775:java.nio.channels.SocketChannel[已连接本地=/0:0:0:0:0:0:0:1:8082远程=/0:0:0:0:0:0:0:0:1:59173]]2023-01-1016:48:16.258DEBUG50544---[nio-8082-exec-7]o.apache.tomcat.util.threads.LimitLatch:倒计时[http-nio-8082-exec-7]闩锁=22023-01-1016:48:16.258DEBUG50544---[nio-8082-exec-7]org.apache.tomcat.util.net.NioEndpoint:调用[org.apache.tomcat.util.net.NioEndpoint@78b6cb49].closeSocket([org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@76712a2f:org.apache.tomcat.util.net.NioChannel@724ea039:java.nio.channels.SocketChannel[本地连接=/0:0:0:0:0:0:0:1:8082remote=/0:0:0:0:0:0:0:1:59176]])这次输出了很多信息,所有的整个请求的信息关闭日志修改上面解析日志级别的方法privateLogLevelresolveLogLevel(Stringlevel){StringtrimmedLevel=level.trim();if("false".equalsIgnoreCase(trimmedLevel)){返回LogLevel.OFF;}returnLogLevel.valueOf(trimmedLevel.toUpperCase(Locale.ENGLISH));}只需将级别设置为false