ログ出力先に全レベルのログを出力して、設定ファイルが期待通りかを確認するツール
Revision | 9ba58a8759820e096b31360627f67ca7782ea859 (tree) |
---|---|
Time | 2022-05-28 20:28:58 |
Author | kemono7h |
Commiter | kemono7h |
いろいろ問題があって現在改修中。構造を変える前に念のため現状を保存する。
@@ -14,9 +14,9 @@ | ||
14 | 14 | </classpathentry> |
15 | 15 | <classpathentry kind="src" output="bin/test" path="src/test/java"> |
16 | 16 | <attributes> |
17 | + <attribute name="test" value="true"/> | |
17 | 18 | <attribute name="gradle_scope" value="test"/> |
18 | 19 | <attribute name="gradle_used_by_scope" value="test"/> |
19 | - <attribute name="test" value="true"/> | |
20 | 20 | </attributes> |
21 | 21 | </classpathentry> |
22 | 22 | <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/> |
@@ -23,10 +23,11 @@ | ||
23 | 23 | } |
24 | 24 | |
25 | 25 | dependencies { |
26 | - implementation 'org.slf4j:slf4j-api:1.7.33' | |
27 | - implementation 'ch.qos.logback:logback-core:1.2.10' | |
28 | - implementation 'ch.qos.logback:logback-classic:1.2.10' | |
26 | + implementation 'org.slf4j:slf4j-api:1.7.36' | |
27 | + implementation 'ch.qos.logback:logback-core:1.2.11' | |
28 | + implementation 'ch.qos.logback:logback-classic:1.2.11' | |
29 | 29 | implementation 'log4j:log4j:1.2.17' |
30 | + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.3' | |
30 | 31 | } |
31 | 32 | |
32 | 33 | test { |
@@ -2,8 +2,9 @@ | ||
2 | 2 | <!DOCTYPE logback> |
3 | 3 | <configuration> |
4 | 4 | <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> |
5 | + <target>System.out</target> | |
5 | 6 | <encoder> |
6 | - <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level %logger{36} - %m%n</pattern> | |
7 | + <pattern>★%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level %logger{36} - %m%n</pattern> | |
7 | 8 | </encoder> |
8 | 9 | </appender> |
9 | 10 |
@@ -18,16 +18,16 @@ | ||
18 | 18 | public class LogConfigTester { |
19 | 19 | |
20 | 20 | private static final Logger logger = LoggerFactory.getLogger(LogConfigTester.class); |
21 | - | |
21 | + | |
22 | 22 | /** |
23 | 23 | * 指定のファイルまたはフォルダに含まれるloggerの設定ファイルを1つずつ読み込んで |
24 | 24 | * その出力先に全レベルのログを出力する。 |
25 | - * | |
25 | + * | |
26 | 26 | * @param path ロガの設定ファイルまたはフォルダ。フォルダはその階層のみ。 |
27 | 27 | * @param count ログ出力する件数。一定サイズでローテーションする場合に利用。 |
28 | 28 | * @param interval ログ1件を出した後に待つ秒数。指定時間になったらローテーションする場合、件数と組み合わせて使用。 |
29 | 29 | */ |
30 | - public void logoutAll(String path, int count, int interval){ | |
30 | + public void logoutAll(String path, int count, double interval){ | |
31 | 31 | File[] files = null; |
32 | 32 | |
33 | 33 | File file = new File(path); |
@@ -36,50 +36,62 @@ | ||
36 | 36 | } else { |
37 | 37 | files = new File[]{file}; |
38 | 38 | } |
39 | - | |
39 | + | |
40 | 40 | List<BaseLogger> loggerList = new ArrayList<BaseLogger>(); |
41 | - loggerList.add(new LogbackLogger()); | |
42 | - loggerList.add(new Log4jLogger()); | |
43 | - | |
41 | + loggerList.add(new LogbackLogger()); | |
42 | + loggerList.add(new Log4jLogger()); | |
43 | + | |
44 | + File prevFile = null; | |
45 | + | |
46 | + // 1回ごとにログ出力設定ファイルを設定する方法だと | |
47 | + // ch.qos.logback.core.rolling.SizeBasedTriggeringPolicyのローテートが機能しない。 | |
48 | + // なぜならSizeBasedTriggeringPolicyが毎回サイズ超えを数回に1回判断しているため | |
49 | + // ログ出力設定を毎回設定すると毎回1回目となり、ローテートが走らなくなる。 | |
50 | + // そのため、ログファイル1つに対しN下位ループする、という方式に変更する。 | |
51 | + | |
44 | 52 | for (int i=0; i<count; i++) { |
45 | - logger.info("*** {} 回目 ***", i); | |
53 | + logger.info("*** {} 回目 ***", i+1); | |
46 | 54 | if (i > 0) { |
47 | 55 | try { |
48 | - Thread.sleep(interval * 1000); | |
56 | + Thread.sleep((int)(interval * 1000)); | |
49 | 57 | } catch (InterruptedException e) { |
50 | 58 | //ignore |
51 | 59 | } |
52 | 60 | } |
53 | - | |
61 | + | |
54 | 62 | for (File f : files) { |
55 | 63 | try { |
56 | 64 | //ループ中に書き換えた設定ファイルが反映されるように毎回読み込む |
57 | 65 | Document doc = loadXmlFile(f); |
58 | - | |
59 | 66 | if (doc == null) { |
60 | 67 | continue; |
61 | 68 | } |
62 | - | |
69 | + | |
63 | 70 | for (BaseLogger bl : loggerList) { |
64 | 71 | if (bl.isTarget(doc)) { |
72 | + logger.info("【全ログ出力】{}:{}", bl.getDocType(), f.getAbsolutePath()); | |
65 | 73 | try { |
66 | - bl.setConfigure(f); | |
74 | + if (prevFile != f) { | |
75 | + System.out.println("ロガー設定 [" + f.getAbsolutePath() + "]"); | |
76 | + bl.setConfigure(f); | |
77 | + } | |
78 | + prevFile = f; | |
67 | 79 | bl.logging(f, doc, i); |
68 | 80 | } catch (Throwable th) { |
69 | 81 | continue; |
70 | 82 | } finally { |
71 | - BaseLogger.setConfigureForLogback(null); | |
83 | + //BaseLogger.setConfigureForLogback(null); | |
72 | 84 | } |
73 | 85 | } |
74 | 86 | } |
75 | - | |
87 | + | |
76 | 88 | } catch (Throwable th) { |
77 | 89 | logger.warn("処理異常発生", th); |
78 | 90 | } |
79 | 91 | } |
80 | 92 | } |
81 | 93 | } |
82 | - | |
94 | + | |
83 | 95 | /** |
84 | 96 | * ログ出力設定ファイル(XML)を読み込んで返す。 |
85 | 97 | * @param file |
@@ -92,7 +104,7 @@ | ||
92 | 104 | if (file.getName().endsWith(".xml") == false) { |
93 | 105 | return null; |
94 | 106 | } |
95 | - | |
107 | + | |
96 | 108 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
97 | 109 | try { |
98 | 110 | dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); //DTDを無視する |
@@ -104,10 +116,10 @@ | ||
104 | 116 | logger.error("設定ファイル読み込み異常 (path=" + file.getAbsolutePath() + ")"); |
105 | 117 | th.printStackTrace(); |
106 | 118 | } |
107 | - | |
119 | + | |
108 | 120 | return null; |
109 | 121 | } |
110 | - | |
122 | + | |
111 | 123 | /** |
112 | 124 | * 起動引数 |
113 | 125 | * [0] ログ設定ファイルのあるフォルダまたはファイル |
@@ -126,10 +138,10 @@ | ||
126 | 138 | logger.info("=== START ==="); |
127 | 139 | String path = args[0]; |
128 | 140 | int count = (args.length > 1) ? Integer.parseInt(args[1]) : 1; |
129 | - int interval = (args.length > 2) ? Integer.parseInt(args[2]) : 0; | |
130 | - | |
141 | + double interval = (args.length > 2) ? Double.parseDouble(args[2]) : 0; | |
142 | + | |
131 | 143 | LogConfigTester app = new LogConfigTester(); |
132 | - app.logoutAll(path, count, interval); | |
144 | + app.logoutAll(path, count, interval); | |
133 | 145 | } |
134 | 146 | |
135 | 147 | } |
@@ -20,19 +20,52 @@ | ||
20 | 20 | |
21 | 21 | private static final Logger logger = LoggerFactory.getLogger(BaseLogger.class); |
22 | 22 | |
23 | + protected String docType; | |
24 | + | |
23 | 25 | public boolean isTarget(Document doc) { |
24 | 26 | return false; |
25 | 27 | } |
26 | - | |
28 | + | |
29 | + public void outputLine(String msg) { | |
30 | + } | |
31 | + | |
27 | 32 | public void setConfigure(File file) { |
28 | 33 | } |
29 | - | |
34 | + | |
30 | 35 | public void logging(File file, Document doc, int count) { |
31 | 36 | } |
32 | - | |
37 | + | |
38 | + public String getDocType() { | |
39 | + return docType; | |
40 | + } | |
41 | + | |
42 | + /** | |
43 | + * 全Documentから%X{n}または%mdc{n}の場所を探して | |
44 | + * nに相当する文字列を返す。 | |
45 | + */ | |
46 | + public List<String[]> getMdcList(Document doc) { | |
47 | + List<String[]> mdcList = new ArrayList<String[]>(); | |
48 | + // %X{key} | |
49 | + // %10X{key} | |
50 | + // %-10X{key} | |
51 | + | |
52 | + // %mdc{key} | |
53 | + // %10mdc{key} | |
54 | + // %-10mdc{key} | |
55 | + | |
56 | + // Pattern p = Pattern.compile("%[-]*\\d*(X|mdc){.+}"); | |
57 | + // String str = doc.get //"%-10X{key}"; | |
58 | + // Matcher m = p.matcher(str); | |
59 | + // if(m.find()){ | |
60 | + // System.out.println(str + ":一致! [" + m.group() + "]"); | |
61 | + // } | |
62 | + | |
63 | + return mdcList; | |
64 | + } | |
65 | + | |
33 | 66 | //以下はユーティリティメソッド的に使う。 |
34 | - | |
35 | - | |
67 | + | |
68 | + | |
36 | 69 | protected List<String> getLoggerNames(Document doc, String logNameTag){ |
37 | 70 | List<String> loggerNames = new ArrayList<String>(); |
38 | 71 |
@@ -43,28 +76,29 @@ | ||
43 | 76 | Element loggereElem = (Element) loggerNodes.item(i); |
44 | 77 | loggerNames.add( loggereElem.getAttribute("name") ); |
45 | 78 | } |
46 | - | |
79 | + | |
47 | 80 | return loggerNames; |
48 | 81 | } |
49 | 82 | |
50 | - | |
83 | + | |
51 | 84 | public static void setConfigureForLogback(File file) throws JoranException { |
52 | 85 | LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); |
53 | - context.reset(); | |
54 | - JoranConfigurator configurator = new JoranConfigurator(); | |
55 | - configurator.setContext(context); | |
86 | + context.reset(); | |
87 | + JoranConfigurator configurator = new JoranConfigurator(); | |
88 | + configurator.setContext(context); | |
56 | 89 | |
57 | - if (file != null) { | |
58 | -// URL configUrl = new URL("file:" + file.getAbsolutePath()); | |
59 | -// logger.info("logconffile: {}", "file:" + file.getAbsolutePath() ); | |
60 | -// configurator.doConfigure(configUrl); | |
61 | - configurator.doConfigure(file.getAbsolutePath()); | |
62 | - } else { | |
63 | - URL url = BaseLogger.class.getResource("/logback.xml"); | |
64 | - configurator.doConfigure(url); | |
65 | - } | |
66 | - | |
67 | - } | |
90 | + if (file != null) { | |
91 | + // URL configUrl = new URL("file:" + file.getAbsolutePath()); | |
92 | + // logger.info("logconffile: {}", "file:" + file.getAbsolutePath() ); | |
93 | + // configurator.doConfigure(configUrl); | |
94 | + configurator.doConfigure(file.getAbsolutePath()); | |
95 | + System.out.println("ロガー設定 : "+ file.getAbsolutePath()); | |
96 | + } else { | |
97 | + URL url = BaseLogger.class.getResource("/logback.xml"); | |
98 | + configurator.doConfigure(url); | |
99 | + } | |
100 | + | |
101 | + } | |
68 | 102 | |
69 | 103 | public static void setConfigureForLog4j(File file) { |
70 | 104 | DOMConfigurator.configure(file.getAbsolutePath()); |
@@ -8,21 +8,32 @@ | ||
8 | 8 | |
9 | 9 | public class Log4jLogger extends BaseLogger{ |
10 | 10 | |
11 | + @Override | |
11 | 12 | public boolean isTarget(Document doc) { |
12 | 13 | boolean b = doc.getDoctype().getName().contains("log4j"); |
13 | 14 | return b; |
14 | 15 | } |
15 | - | |
16 | + | |
17 | + public void outputLine() { | |
18 | + } | |
19 | + | |
20 | + @Override | |
16 | 21 | public void setConfigure(File file) { |
17 | 22 | setConfigureForLog4j(file); |
18 | 23 | } |
19 | - | |
24 | + | |
25 | + @Override | |
26 | + public String getDocType() { | |
27 | + return "log4j"; | |
28 | + } | |
29 | + | |
30 | + @Override | |
20 | 31 | public void logging(File file, Document doc, int count) { |
21 | 32 | Exception warnEx = new RuntimeException("警告時の例外情報です。"); |
22 | 33 | Exception errorEx = new RuntimeException("異常時の例外情報です。"); |
23 | 34 | List<String> names = getLoggerNames(doc, "logger"); |
24 | 35 | String configPath = "[" + file.getName() + "]"; |
25 | - | |
36 | + | |
26 | 37 | for (String name : names) { |
27 | 38 | if (name == null) { |
28 | 39 | name = this.getClass().getCanonicalName(); |
@@ -37,5 +48,5 @@ | ||
37 | 48 | log.fatal("ログメッセージを出力します [" + configPath + "][ERROR][" + count + "][" + name + "]", errorEx); |
38 | 49 | } |
39 | 50 | } |
40 | - | |
51 | + | |
41 | 52 | } |
@@ -7,15 +7,36 @@ | ||
7 | 7 | import org.slf4j.LoggerFactory; |
8 | 8 | import org.w3c.dom.Document; |
9 | 9 | |
10 | -public class LogbackLogger extends BaseLogger{ | |
10 | +import ch.qos.logback.classic.LoggerContext; | |
11 | +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; | |
12 | +import ch.qos.logback.core.ConsoleAppender; | |
13 | + | |
14 | +public class LogbackLogger extends BaseLogger { | |
11 | 15 | |
12 | 16 | private static final Logger logger = LoggerFactory.getLogger(LogbackLogger.class); |
13 | 17 | |
18 | + @Override | |
14 | 19 | public boolean isTarget(Document doc) { |
15 | - boolean b = doc.getDoctype().getName().contains("logback"); | |
20 | + boolean b = doc.getDoctype().getName().contains(getDocType()); | |
16 | 21 | return b; |
17 | 22 | } |
18 | 23 | |
24 | + @Override | |
25 | + public void outputLine(String msg) { | |
26 | + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); | |
27 | + | |
28 | + //Pattern - MessageOnly | |
29 | + PatternLayoutEncoder encoder = new PatternLayoutEncoder(); | |
30 | + encoder.setContext(loggerContext); | |
31 | + encoder.setPattern("%%m%n"); | |
32 | + encoder.start(); | |
33 | + | |
34 | + //sg | |
35 | + ConsoleAppender appender = new ConsoleAppender(); | |
36 | + appender.setContext(loggerContext); | |
37 | + } | |
38 | + | |
39 | + @Override | |
19 | 40 | public void setConfigure(File file){ |
20 | 41 | try { |
21 | 42 | setConfigureForLogback(file); |
@@ -23,24 +44,31 @@ | ||
23 | 44 | throw new RuntimeException(ex); |
24 | 45 | } |
25 | 46 | } |
26 | - | |
47 | + | |
48 | + @Override | |
49 | + public String getDocType() { | |
50 | + return "logback"; | |
51 | + } | |
52 | + | |
53 | + @Override | |
27 | 54 | public void logging(File file, Document doc, int count) { |
28 | 55 | Exception warnEx = new RuntimeException("警告時の例外情報です。"); |
29 | 56 | Exception errorEx = new RuntimeException("異常時の例外情報です。"); |
30 | 57 | List<String> names = getLoggerNames(doc, "logger"); |
31 | 58 | String configPath = "[" + file.getName() + "]"; |
32 | - | |
59 | + | |
33 | 60 | for (String name : names) { |
34 | 61 | if (name == null) { |
35 | 62 | name = this.getClass().getCanonicalName(); |
36 | 63 | } |
64 | + System.out.println("カテゴリ名[" + name + "]"); | |
37 | 65 | Logger log = LoggerFactory.getLogger(name); |
38 | 66 | // ログメッセージを出力します [logback.xml][DEBUG][0][org.commons.lang3] |
39 | - log.trace("ログメッセージを出力します [{}][TRACE][{}][{}]", configPath, count, name); | |
40 | - log.debug("ログメッセージを出力します [{}][DEBUG][{}][{}]", configPath, count, name); | |
41 | - log.info ("ログメッセージを出力します [{}][INFO ][{}][{}]", configPath, count, name); | |
42 | - log.warn ("ログメッセージを出力します [{}][WARN ][{}][{}]", configPath, count, name, warnEx); | |
43 | - log.error("ログメッセージを出力します [{}][ERROR][{}][{}]", configPath, count, name, errorEx); | |
67 | + log.trace("ログメッセージを出力します [{}][{}][TRACE][{}]", count, name, configPath); | |
68 | + log.debug("ログメッセージを出力します [{}][{}][DEBUG][{}]", count, name, configPath); | |
69 | + log.info ("ログメッセージを出力します [{}][{}][INFO ][{}]", count, name, configPath); | |
70 | + log.warn ("ログメッセージを出力します [{}][{}][WARN ][{}]", count, name, configPath, warnEx); | |
71 | + log.error("ログメッセージを出力します [{}][{}][ERROR][{}]", count, name, configPath, errorEx); | |
44 | 72 | } |
45 | 73 | } |
46 | 74 |
@@ -2,8 +2,9 @@ | ||
2 | 2 | <!DOCTYPE logback> |
3 | 3 | <configuration> |
4 | 4 | <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> |
5 | + <target>System.out</target> | |
5 | 6 | <encoder> |
6 | - <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level %logger{36} - %m%n</pattern> | |
7 | + <pattern>★%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level %logger{36} - %m%n</pattern> | |
7 | 8 | </encoder> |
8 | 9 | </appender> |
9 | 10 |