12
12
import org .apache .logging .log4j .core .impl .ThrowableProxy ;
13
13
import org .apache .logging .log4j .core .pattern .*;
14
14
15
+ import cpw .mods .modlauncher .Launcher ;
16
+ import cpw .mods .modlauncher .api .IEnvironment ;
17
+ import cpw .mods .modlauncher .api .ITransformerAuditTrail ;
18
+
19
+ import java .util .ArrayList ;
15
20
import java .util .Collections ;
21
+ import java .util .List ;
22
+ import java .util .Map ;
23
+ import java .util .Optional ;
24
+ import java .util .TreeMap ;
16
25
17
26
/**
18
27
* Started as a copy of {@link org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter} because
21
30
@ Plugin (name = "TransformingThrowablePatternConverter" , category = PatternConverter .CATEGORY )
22
31
@ ConverterKeys ({ "tEx" })
23
32
public class TransformingThrowablePatternConverter extends ThrowablePatternConverter {
24
- static final String SUFFIXFLAG ="☃☃☃☃☃SUFFIXFLAG☃☃☃☃☃" ;
33
+ // Logger needs a suffix to trigger our 'enhancement' so pass in something that isn't empty.
34
+ @ SuppressWarnings ("unused" )
35
+ private static final String SUFFIXFLAG = "{}" ;
25
36
/**
26
37
* @param name Name of converter.
27
38
* @param style CSS style for output.
@@ -36,22 +47,75 @@ protected TransformingThrowablePatternConverter(final Configuration config, fina
36
47
* {@inheritDoc}
37
48
*/
38
49
@ Override
39
- public void format (final LogEvent event , final StringBuilder toAppendTo ) {
40
- final ThrowableProxy proxy = event .getThrownProxy ();
41
- final Throwable throwable = event .getThrown ();
42
- if ((throwable != null || proxy != null ) && options .anyLines ()) {
43
- if (proxy == null ) {
44
- super .format (event , toAppendTo );
45
- return ;
46
- }
47
- final int len = toAppendTo .length ();
48
- if (len > 0 && !Character .isWhitespace (toAppendTo .charAt (len - 1 ))) {
49
- toAppendTo .append (' ' );
50
- }
51
- final TextRenderer textRenderer = new ExtraDataTextRenderer (options .getTextRenderer ());
52
- proxy .formatExtendedStackTraceTo (toAppendTo , options .getIgnorePackages (),
53
- textRenderer , SUFFIXFLAG , options .getSeparator ());
50
+ public void format (@ SuppressWarnings ("exports" ) final LogEvent event , final StringBuilder buf ) {
51
+ var proxy = event .getThrownProxy ();
52
+ if (!options .anyLines ())
53
+ return ;
54
+
55
+ if (proxy == null ) {
56
+ super .format (event , buf );
57
+ return ;
54
58
}
59
+
60
+ var len = buf .length ();
61
+ if (len > 0 && !Character .isWhitespace (buf .charAt (len - 1 )))
62
+ buf .append (' ' );
63
+
64
+ var trail = Optional .ofNullable (Launcher .INSTANCE )
65
+ .map (Launcher ::environment )
66
+ .flatMap (env -> env .getProperty (IEnvironment .Keys .AUDITTRAIL .get ()))
67
+ .orElse (null );
68
+
69
+ var nl = options .getSeparator ();
70
+ var renderer = options .getTextRenderer ();
71
+ var suffix = "" ;
72
+ //renderer = new ExtraDataTextRenderer(renderer, trail);
73
+ //suffix = SUFFIXFLAG;
74
+ proxy .formatExtendedStackTraceTo (buf , options .getIgnorePackages (), renderer , suffix , nl );
75
+
76
+ if (trail == null )
77
+ return ;
78
+
79
+ final Map <String , List <String >> audit = new TreeMap <>();
80
+ buildAuditMap (trail , audit , proxy );
81
+
82
+ line (buf , "Transformer Audit:" );
83
+ for (var cls : audit .keySet ()) {
84
+ line (buf , " " , cls );
85
+ for (var line : audit .get (cls ))
86
+ line (buf , " " , line );
87
+ }
88
+ System .currentTimeMillis ();
89
+ }
90
+
91
+ private void line (StringBuilder sb , String ... parts ) {
92
+ var renderer = options .getTextRenderer ();
93
+ for (var pt : parts )
94
+ renderer .render (pt , sb , "Text" );
95
+ renderer .render (options .getSeparator (), sb , "Text" );
96
+ }
97
+
98
+ private static void buildAuditMap (ITransformerAuditTrail trail , Map <String , List <String >> map , ThrowableProxy proxy ) {
99
+ if (proxy == null )
100
+ return ;
101
+
102
+ for (var element : proxy .getExtendedStackTrace ()) {
103
+ var cls = element .getClassName ();
104
+ if (map .containsKey (cls ))
105
+ continue ;
106
+
107
+ var lines = new ArrayList <String >();
108
+ for (var activity : trail .getActivityFor (cls ))
109
+ lines .add (activity .getType ().name () + ": " + String .join (":" , activity .getContext ()));
110
+
111
+ if (!lines .isEmpty ())
112
+ map .put (cls , lines );
113
+ }
114
+
115
+ for (final ThrowableProxy suppressed : proxy .getSuppressedProxies ())
116
+ buildAuditMap (trail , map , suppressed );
117
+
118
+ buildAuditMap (trail , map , proxy .getCauseProxy ());
55
119
}
56
120
57
121
/**
@@ -62,17 +126,39 @@ public void format(final LogEvent event, final StringBuilder toAppendTo) {
62
126
* only the first line of the throwable will be formatted.
63
127
* @return instance of class.
64
128
*/
65
- public static TransformingThrowablePatternConverter newInstance (final Configuration config , final String [] options ) {
129
+ public static TransformingThrowablePatternConverter newInstance (@ SuppressWarnings ( "exports" ) final Configuration config , final String [] options ) {
66
130
return new TransformingThrowablePatternConverter (config , options );
67
131
}
68
132
69
-
133
+ @ Deprecated ( forRemoval = true , since = "10.2.2" )
70
134
public static String generateEnhancedStackTrace (final Throwable throwable ) {
71
- final ThrowableProxy proxy = new ThrowableProxy (throwable );
72
- final StringBuilder buffer = new StringBuilder ();
73
- final TextRenderer textRenderer = new ExtraDataTextRenderer (PlainTextRenderer .getInstance ());
74
- proxy .formatExtendedStackTraceTo (buffer , Collections .emptyList (),
75
- textRenderer , SUFFIXFLAG , Strings .LINE_SEPARATOR );
76
- return buffer .toString ();
135
+ var proxy = new ThrowableProxy (throwable );
136
+ var buf = new StringBuilder ();
137
+
138
+ var trail = Optional .ofNullable (Launcher .INSTANCE )
139
+ .map (Launcher ::environment )
140
+ .flatMap (env -> env .getProperty (IEnvironment .Keys .AUDITTRAIL .get ()))
141
+ .orElse (null );
142
+
143
+ var nl = Strings .LINE_SEPARATOR ;
144
+ var renderer = PlainTextRenderer .getInstance ();
145
+ var suffix = "" ;
146
+ //renderer = new ExtraDataTextRenderer(renderer, trail);
147
+ //suffix = SUFFIXFLAG;
148
+ proxy .formatExtendedStackTraceTo (buf , Collections .emptyList (), renderer , suffix , nl );
149
+
150
+ if (trail != null ) {
151
+ final Map <String , List <String >> audit = new TreeMap <>();
152
+ buildAuditMap (trail , audit , proxy );
153
+
154
+ buf .append ("Transformer Audit:" ).append (nl );
155
+ for (var cls : audit .keySet ()) {
156
+ buf .append (" " ).append (cls ).append (nl );
157
+ for (var line : audit .get (cls ))
158
+ buf .append (" " ).append (line ).append (nl );
159
+ }
160
+ }
161
+
162
+ return buf .toString ();
77
163
}
78
164
}
0 commit comments