log4jロギングシステムを統合1.SpringBoot
我々は、すべてのプログラマがコードをノックことを知っているが、非常にクールです、彼らはそれらをノックアウトする線でコードラインにギャップのアイデアを埋めるために彼らの心を置くが、!!!本当に痛いたびに探してBUGは、その後、プログラム内のログ・レコードが必要であり、今日は私がどのようにSpringBootでlog4jロギングシステムを統合する方法を教えるつもりです。
1.まず、削除SpringBootログシステムが来ます
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
ログの依存フレームを追加します。2.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
3. [追加log4j.properties
#把指定级别以上的日志信息输出到指定的一个或者多个位置
log4j.rootLogger=DEBUG,stdout,file
#表示Logger会在父Logger的appender里输出,默认为true
log4j.additivity.org.apache=true
#表示日志在控制台上输出 (1)org.apache.log4j.ConsoleAppender(控制台)
#(2)org.apache.log4j.FileAppender(文件)
#(3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
#(4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
#(5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#日志级别是INFO级别的,除了DEBUG以外都会输出
log4j.appender.stdout.threshold=INFO
# 日志的输出格式:(1)org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#(2)org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
#(3)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
#(4)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 日志的具体输出格式:格式化符号说明:
#
#%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
#%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
#%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
#%t:输出产生该日志事件的线程名。
#%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
#%c:输出日志信息所属的类目,通常就是所在类的全名。
#%M:输出产生日志信息的方法名。
#%F:输出日志消息产生时所在的文件名称。
#%L::输出代码中的行号。
#%m::输出代码中指定的具体日志信息。
#%n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
#%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
#%%:输出一个"%"字符。
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=/workspaces/logs/foodie-api/imooc.log
2.ログAOPによって達成監視サービス実行時間を達成するために、
1.aopは何ですか
スプリングフレームワークAOPは、AOPは、「クロス」技術と呼ばれる使用、多機能ビジネスプロセスは、一般的な抽出を伴い、個々に独立したセクションを形成するためにパッケージ化され、適切なタイミングでこれらのファセットカットを横切る、アスペクト指向プログラミングと考えられていますビジネスプロセスに場所を指定しました。
例えば、業務システムでは、ユーザのログインは、ユーザーのビジネスプロセスに関連するすべてのシステムにログインするには、ユーザーが必要な、関数の基礎です。必要性は、ユーザのログイン機能を変更する際に、各ビジネス・プロセスに書き込まれたユーザログイン機能コードと、コードの冗長性になり、メンテナンスは、非常に面倒で、各ユーザーのログインコードのビジネスプロセスを変更する必要があり、このアプローチ明らかに望ましくありません。グッドプラクティスは、サービス利用者のログイン・プロセス、システムが自動的にログ機能をビジネスプロセスにカットしたときに、独立したモジュールを形成するために、抽出したユーザのログイン機能にあります。
プロジェクト内2. Aopと、AOP依存関係を追加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
クラスのセクションを作成します3。
クラス分類、2つの段階、にカットを入れて
容器IOCに追加されたアスペクトクラスのカテゴリに@Componentアノテーションを使って①
アスペクトクラスのクラスを作る際に使用②@Aspect注釈
4.AOPサポート通知
1、事前通知@Before:アドバイスは、それが例外をスローしない限り、そうでなければ、通知は、接続点の前に実行の流れを止めることはできない、参加ポイントの前に実行されます。
2、アドバイス@AfterReturning後:通知は、接続点の後に実行され、一致が(アドバイスの戻り値の後に結合させることができる)が返されたときに方法が一般的に行われている
3、後部異常通知@AfterThrowing:プロセスでスローされた通知は、異常終了を行いました。
図4に示すように、リヤファイナル通知@After:結合点は撤回する通知(正常または例外リターンかどうか)。
図5に示すように、周りのアドバイス@Around:通知の接続点を囲む、およびメソッド呼び出しなどが挙げられます。これは、アドバイスの中で最も強力なものです。アドバイスの周りメソッド呼び出しの前と後のカスタム動作を実行することができ、それが接続ポイントを続行するか、直接バック独自の戻り値または例外の実行を投げるかどうかを選択します。
5.ポイントカット表現
定義されたエントリ・ポイントの必要性は、任意の引数の名前及び署名を含む場合、そのような実行のようなエントリポイントの発現、(公共* com.example.aop ...(...がある ))、
実行([可視性:フォーマットポイントカット式は]戻り型[宣言された型]メソッド名(パラメータ)[例外])
[]は、ワイルドカードを使用するオプション、追加の支持体です。
- *:すべての文字にマッチします
- ...:典型的には、複数のパラメータ、複数のパケットを一致させるために使用
- +:クラスを表し、そのサブクラス
4)事業者は、次のとおりです。&&、||、!
コードの実行時間によって実装6.リスニングサービスは、ログAOPによって達成されます
package com.test.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ServiceLogAspect {
final static Logger log = LoggerFactory.getLogger(ServiceLogAspect.class);
/**
* AOP通知:
* 1. 前置通知:在方法调用之前执行
* 2. 后置通知:在方法正常调用之后执行
* 3. 环绕通知:在方法调用之前和之后,都分别可以执行的通知
* 4. 异常通知:如果在方法调用过程中发生异常,则通知
* 5. 最终通知:在方法调用之后执行
*/
/**
* 切面表达式:
* execution 代表所要执行的表达式主体
* 第一处 * 代表方法返回类型 *代表所有类型
* 第二处 包名代表aop监控的类所在的包
* 第三处 .. 代表该包以及其子包下的所有类方法
* 第四处 * 代表类名,*代表所有类
* 第五处 *(..) *代表类中的方法名,(..)表示方法中的任何参数
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("execution(* com.imooc.service.impl..*.*(..))")
public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("====== 开始执行 {}.{} ======",
joinPoint.getTarget().getClass(),
joinPoint.getSignature().getName());
// 记录开始时间
long begin = System.currentTimeMillis();
// 执行目标 service
Object result = joinPoint.proceed();
// 记录结束时间
long end = System.currentTimeMillis();
long takeTime = end - begin;
if (takeTime > 3000) {
log.error("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
} else if (takeTime > 2000) {
log.warn("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
} else {
log.info("====== 执行结束,耗时:{} 毫秒 ======", takeTime);
}
return result;
}
}