slf4j 替換jcl、jul集成方案 spring
提問:服務器
假設Spring 框架要打印日誌,應該選擇中其中哪個組件? app
發現哪一個都不能選,只能基於應用實際使用的日誌組件來。否則就會日誌打印會多份。框架
怎麼找到應用實際使用的日誌組件 Apache Commons Loging 解決了這個問題測試
Apache Commons Loging (JCL)spa
Commons Loging 自己只提供日誌接口,具體實如今運行時動態尋找對應組件?好比:log4j、jdk14looger 等。但這種動態綁定的方式當系統特別寵大的時候會出現綁定失敗的問題。如今比較流行的slf4j 基於靜態綁定的方式解決了這個問題?debug
slf4j3d
sl4j 自己也只提供日誌接口,與commons loging 不一樣的是其採用在classPath 加入如下jar包來表示具體採用哪一種實現 :日誌
提問:code
假設大家系統當中以前在用 JCL 打印日誌,但這時想加入slf4j來打印日誌,就會出現兩類日誌輸出如何解決?
加入以下等JAR包jcl-over-slf4j、log4j-over-sl4j、jul-over-sl4j ,便可在使用原API的狀況下,又統一至slf4j 的實現進行輸出了。 .
<?xml version="1.0" encoding="UTF-8" ?> <Configuration status="error"> <!-- 定義輸出源 --> <Appenders> <Console name="Console" target="SYSTEM_ERR"> <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/> </Console> <!-- 測試環境使用--> <File name="file" fileName="logs/all.log" append="false"> <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/> </File> <RollingFile name="rollingFile" fileName="logs/all-2.log" filePattern="logs/$${date:yyyy-MM-dd}/all-%d{yyyy-MM-dd-HH}-%i.zip"> <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="2 KB"/> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> <RollingFile name="errorRollingFile" fileName="logs/error2.log" filePattern="logs/$${date:yyyy-MM-dd}-error/error-%d{yyyy-MM-dd-HH}-%i.zip"> <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/> <ThresholdFilter level="error" /> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="2 KB"/> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> </Appenders> <!-- 具體的日誌配置 name =--> <Loggers> <!-- <Logger name="org.springframework" level="error"> <AppenderRef ref="Console"/> </Logger>--> <Logger name="com" level="info"> <AppenderRef ref="rollingFile"/> <AppenderRef ref="errorRollingFile"/> </Logger> <AsyncRoot level="debug"> <AppenderRef ref="Console"/> <!-- <AppenderRef ref="file"/> <AppenderRef ref="rollingFile"/>--> </AsyncRoot> </Loggers> </Configuration>
@ControllerAdvice public class ExceptionAdviceController { @ResponseBody @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) public String handleBusinessException(BusinessException exception) { HttpResult result = new HttpResult(); result.fail(exception.getCode()).message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(AuthorizationException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) public String handleAuthorizationException(AuthorizationException exception) { HttpResult result = new HttpResult(); result.fail(exception.getCode()).message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(HttpMessageNotReadableException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public String handleHttpMessageNotReadableException(HttpMessageNotReadableException exception) { HttpResult result = new HttpResult(); logger.error("handleHttpMessageNotReadableException exception{}", exception); result.fail("400").message("HTTP_MESSAGE_NOT_READABLE"); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(MissingServletRequestParameterException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public String handleMissingServletRequestParameterException(MissingServletRequestParameterException exception) { HttpResult result = new HttpResult(); result.fail("400").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public String handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { HttpResult result = new HttpResult(); // Always get the first error's default message BindingResult bindingResult = exception.getBindingResult(); ObjectError error = bindingResult.getAllErrors().get(0); String message = ""; if (error instanceof FieldError) { FieldError fieldError = (FieldError) error; message = "Field error on field '" + fieldError.getField() + "': " + fieldError.getDefaultMessage(); } else { message = error.getDefaultMessage(); } result.fail("400").message(message); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(BindException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public String handleBindException(BindException exception) { HttpResult result = new HttpResult(); // Always get the first error's default message BindingResult bindingResult = exception.getBindingResult(); ObjectError error = bindingResult.getAllErrors().get(0); String message = ""; if (error instanceof FieldError) { FieldError fieldError = (FieldError) error; message = "Field error on field '" + fieldError.getField() + "': " + fieldError.getDefaultMessage(); } else { message = error.getDefaultMessage(); } result.fail("400").message(message); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(MissingRequestBodyParameterException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public String handleMissingRequestBodyParameterException(MissingRequestBodyParameterException exception) { HttpResult result = new HttpResult(); result.fail("400").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(NoSuchRequestHandlingMethodException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handleNoSuchRequestHandlingMethodException(NoSuchRequestHandlingMethodException exception) { HttpResult result = new HttpResult(); result.fail("404").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handleNoHandlerFoundException(NoHandlerFoundException exception) { HttpResult result = new HttpResult(); result.fail("404").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(HttpRequestMethodNotSupportedException.class) @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) public String handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException exception) { HttpResult result = new HttpResult(); result.fail("405").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) @ResponseStatus(HttpStatus.NOT_ACCEPTABLE) public String handleHttpMediaTypeNotAcceptableException(HttpMediaTypeNotAcceptableException exception) { HttpResult result = new HttpResult(); result.fail("406").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(HttpMediaTypeNotSupportedException.class) @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) public String handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException exception) { HttpResult result = new HttpResult(); result.fail("415").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(ConversionNotSupportedException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String handleConversionNotSupportedException(ConversionNotSupportedException exception) { HttpResult result = new HttpResult(); result.fail("500").message(exception.getMessage()); return JsonUtils.toJsonString(result); } @ResponseBody @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String handleException(Exception exception) { if (exception.getClass().getName().endsWith("ClientAbortException")) { logger.warn("ClientAbortException: ", exception); }else { logger.error("Unhandled Exception: ", exception); } HttpResult result = new HttpResult(); result.fail("500").message("服務器未知異常"); return JsonUtils.toJsonString(result); } }