1+ package org .tron .common .log .layout ;
2+
3+ import ch .qos .logback .classic .Logger ;
4+ import ch .qos .logback .classic .encoder .PatternLayoutEncoder ;
5+ import ch .qos .logback .classic .spi .ILoggingEvent ;
6+ import ch .qos .logback .core .Context ;
7+ import ch .qos .logback .core .Layout ;
8+ import java .nio .charset .Charset ;
9+ import java .util .ArrayList ;
10+ import java .util .HashMap ;
11+ import java .util .List ;
12+ import java .util .Map ;
13+
14+ public class MultiLayoutPattern extends PatternLayoutEncoder {
15+ private List <Rule > rules = new ArrayList <>();
16+ private Map <String , Layout <ILoggingEvent >> layoutMap = new HashMap <>();
17+
18+ public void addRule (Rule rule ) {
19+ this .rules .add (rule );
20+ rule .start (context );
21+ }
22+
23+ public byte [] encode (ILoggingEvent event ) {
24+ Layout <ILoggingEvent > layout = getLayout (event .getLoggerName ());
25+ String txt = layout .doLayout (event );
26+ return convertToBytes (txt );
27+ }
28+
29+ private byte [] convertToBytes (String s ) {
30+ Charset charset = getCharset ();
31+ if (charset == null ) {
32+ return s .getBytes ();
33+ } else {
34+ return s .getBytes (charset );
35+ }
36+ }
37+
38+ private Layout <ILoggingEvent > getLayout (final String name ) {
39+ if (name == null ) {
40+ throw new IllegalArgumentException ("name cannot be null" );
41+ }
42+ if (Logger .ROOT_LOGGER_NAME .equalsIgnoreCase (name )) {
43+ return this .getLayout ();
44+ }
45+ if (layoutMap .containsKey (name )) {
46+ return layoutMap .get (name );
47+ }
48+ Layout <ILoggingEvent > layout = getLayout ();
49+ for (Rule rule : rules ) {
50+ if (rule .logger .equals (name )) {
51+ layout = rule .getPatternLayoutEncoder ().getLayout ();
52+ break ;
53+ }
54+ }
55+ layoutMap .put (name , layout );
56+ return layout ;
57+ }
58+
59+ @ Override
60+ public void start () {
61+ super .start ();
62+ }
63+
64+ public static class Rule {
65+ private String logger ;
66+ private String pattern ;
67+ private PatternLayoutEncoder patternLayoutEncoder ;
68+ private boolean outputPatternAsHeader = false ;
69+
70+ public String getLogger () {
71+ return logger ;
72+ }
73+
74+ public void setLogger (String logger ) {
75+ this .logger = logger ;
76+ }
77+
78+ public String getPattern () {
79+ return pattern ;
80+ }
81+
82+ public void setPattern (String pattern ) {
83+ this .pattern = pattern ;
84+ }
85+
86+ public boolean isOutputPatternAsHeader () {
87+ return outputPatternAsHeader ;
88+ }
89+
90+ public void setOutputPatternAsHeader (boolean outputPatternAsHeader ) {
91+ this .outputPatternAsHeader = outputPatternAsHeader ;
92+ }
93+
94+ public PatternLayoutEncoder getPatternLayoutEncoder () {
95+ return patternLayoutEncoder ;
96+ }
97+
98+ public void start (Context context ) {
99+ patternLayoutEncoder = new PatternLayoutEncoder ();
100+ patternLayoutEncoder .setPattern (pattern );
101+ patternLayoutEncoder .setContext (context );
102+ patternLayoutEncoder .setOutputPatternAsHeader (outputPatternAsHeader );
103+ patternLayoutEncoder .start ();
104+ }
105+ }
106+ }
0 commit comments