loggable

AOP to log java methods developed by SeaHuang

License

License

GroupId

GroupId

com.github.sea-huang
ArtifactId

ArtifactId

loggable
Last Version

Last Version

1.3.0
Release Date

Release Date

Type

Type

jar
Description

Description

loggable
AOP to log java methods developed by SeaHuang
Project URL

Project URL

https://github.com/sea-huang/loggable
Source Code Management

Source Code Management

https://github.com/sea-huang/loggable.git

Download loggable

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.sea-huang/loggable/ -->
<dependency>
    <groupId>com.github.sea-huang</groupId>
    <artifactId>loggable</artifactId>
    <version>1.3.0</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.sea-huang/loggable/
implementation 'com.github.sea-huang:loggable:1.3.0'
// https://jarcasting.com/artifacts/com.github.sea-huang/loggable/
implementation ("com.github.sea-huang:loggable:1.3.0")
'com.github.sea-huang:loggable:jar:1.3.0'
<dependency org="com.github.sea-huang" name="loggable" rev="1.3.0">
  <artifact name="loggable" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.sea-huang', module='loggable', version='1.3.0')
)
libraryDependencies += "com.github.sea-huang" % "loggable" % "1.3.0"
[com.github.sea-huang/loggable "1.3.0"]

Dependencies

compile (7)

Group / Artifact Type Version
org.springframework.boot : spring-boot-starter jar
org.springframework.boot : spring-boot-starter-aop jar
org.slf4j : slf4j-api jar
org.springframework.boot : spring-boot-starter-validation Optional jar
com.alibaba : fastjson Optional jar 1.2.47
com.fasterxml.jackson.core : jackson-databind Optional jar
com.google.code.gson : gson Optional jar

test (4)

Group / Artifact Type Version
org.springframework.boot : spring-boot-starter-log4j jar 1.3.8.RELEASE
org.springframework.boot : spring-boot-test jar
org.springframework : spring-test jar
junit : junit jar

Project Modules

There are no modules declared in this project.

中文

loggable

AOP Log facilities to rescue you from logging java methods

Version changes

  • 1.0.0 main features
  • 1.0.1 fix autodetecting json frameworks
  • 1.1.0 add support for Gson and Log Duration feature
  • 1.1.1 fix DurationRecorder prototype
  • 1.1.2 remove dependency spring-starter-logging, add support for xml config
  • 1.1.3 remove incompatible java.lang.Parameter. fix test facilities.
  • 1.2.0 add @LogScript, enhance stability
  • 1.3.0 add spring boot support, default level on success from INFO to DEBUG

Set up

  • add maven dependency:

     <dependency>
       <groupId>com.github.sea-huang</groupId>
       <artifactId>loggable</artifactId>
       <version>1.3.0</version>
     </dependency>
  • optinally dependencies, alibaba's FastJson, Jackson or Gson will be auto detected to seriliaze the arguments and results. If neither found on the path, it will default to Object.toString()

     <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
     </dependency>
     <dependency>
     	<groupId>com.fasterxml.jackson.core</groupId>
     	<artifactId>jackson-databind</artifactId>
     </dependency>
     <dependency>
     	<groupId>com.google.code.gson</groupId>
     	<artifactId>gson</artifactId>
     </dependency>
  • Bring in the facilities

    @EnableLoggable
      @Configuration
      public class AnyConfigClass{
      
      }
      

    or XML config

     <bean class="com.github.seahuang.log.spring.LoggableAutoConfiguration">
     	<property name="globalLogDuration" value="true"/><!--optional-->
     </bean>

    for spring boot project, Loggable is auto configuired without any specific declaring. but two optional config available:

      loggable.enabled=false
      loggable.globalLogDuration=true
      

Usage Examples

  • Service to be tested

    @Service
      public class TesteeService {
      	@Loggable("Purpose")
      	public String simpleCall(String stringArg, Integer intArg){
      		return "result";
      	}
      }
      
  • Just add the @Loggable annotation to the method, and it will log all the arguments and result value as below:

2018-05-15 11:36:21.879  INFO 63398 --- [           main] 
c.g.seahuang.log.stub.TesteeService      :
Purpose Success! TesteeService.simpleCall(stringArg="AA",intArg=10) returns "result"
  • On exception case:
ExexptionTest Fail! TesteeService.throwException(stringArg="AA",intArg=10)
	
java.lang.RuntimeException: Intentional Exception
		at com.github.seahuang.log.stub.TesteeService.throwException(TesteeService.java:35) ~[test-classes/:na]
		at com.github.seahuang.log.stub.TesteeService$$FastClassBySpringCGLIB$$5d883f5f.invoke() ~[test-classes/:na]
		at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.7.RELEASE.jar:4.3.7.RELEASE]
		at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721) ~[spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
		at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
		at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:139) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
		at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
		at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.3.7.RELEASE.jar:4.3.7.RELEASE]
		at com.github.seahuang.log.LoggableAspect.log(LoggableAspect.java:18) ~[classes/:na]
		...
  • Wanna log only on Exception and keep silence in Success? Set Level.OFF on Success
@Loggable(value="SilenceSuccessTest", onSuccess=Level.OFF)
public String keepSilenceOnSuccess(String one, Integer two){
	return null;
}
  • Wanna log warnning on some business exception?
@Loggable(value="Purpose", warningOn=BusinessException.class)
public String logWarnninngOnBusinessException(String one, Integer two){
	return null;
}
  • More complicated case:
@Loggable("CustomizedLog")
public @LogLength List customizeLog(@LogIgnore String one
			, @LogFormat(ExceptionTypeFormatter.class) Exception t){
	...
}
  • @LogLength only log the length of a collection or array.
  • @LogIngore ignore the parameter or result when format the output
  • @LogFormat give a self defined implementation class type for TypeFormatter, by which to format the parameter output
  • @LogScript use script to customize the format, SPEL for default / javascript and other java supported script engines also included
 	@Loggable("Script log test")
	public @LogScript("#t.size() > 1 ? #t[0] + #t[1] : ''")List logScript(
			@LogScript("'arg1: ' + #t") String one
			,@LogScript("10 + #t") Integer two){
 
 
  • Combine with Method Validation
@Loggable("validateMethod")
public @NotNull List validateParameters(@NotEmpty String one, @NotNull Integer two){
		return null;
}
  • Log the duration time each method call costs
    • global setting, it will apply all @Loggable methods without specific LogDuration assigned or LogDuration equals to Default

      @EnableLoggable(logDuration=true)
      
    • each method call assign it's own Duration log strategy, which will override the global settings

      @Loggable(logDuration=LogDuration.YES)
      

Customization

  • Refer to com.github.seahuang.log.spring.LoggableAutoConfiguration. All classes are connected by interfaces, and can be replaced by your own implementation.
  • An important explanation, global customized exception log formatter can be apply by implemnt com.github.seahuang.log.formatter.LogFormatter or extend com.github.seahuang.log.formatter.LogFormatterSupport(should register to spring). the most precise exception formatter will be used.

Versions

Version
1.3.0
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0