1
+ package com .tcn .exile .logger ;
2
+
3
+ import org .slf4j .Logger ;
4
+ import org .slf4j .MDC ;
5
+ import org .slf4j .spi .LocationAwareLogger ;
6
+ import org .slf4j .event .Level ;
7
+ import org .slf4j .LoggerFactory ;
8
+
9
+ public class TenantLogger {
10
+ private final Logger logger ;
11
+ private final LocationAwareLogger locationAwareLogger ;
12
+ private static final String FQCN = TenantLogger .class .getName ();
13
+ private final String tenant ;
14
+
15
+ public TenantLogger (Logger logger ) {
16
+ this .logger = logger ;
17
+ this .locationAwareLogger = (logger instanceof LocationAwareLogger ) ? (LocationAwareLogger ) logger : null ;
18
+ this .tenant = null ;
19
+ }
20
+
21
+ public TenantLogger (String name , String tenant ) {
22
+ this .logger = LoggerFactory .getLogger (name );
23
+ this .locationAwareLogger = (logger instanceof LocationAwareLogger ) ? (LocationAwareLogger ) logger : null ;
24
+ this .tenant = tenant ;
25
+ }
26
+
27
+ public void trace (String tenant , String msg ) {
28
+ withTenant (tenant , () -> log (Level .TRACE , msg , (Object [])null ));
29
+ }
30
+
31
+ public void trace (String tenant , String format , Object arg ) {
32
+ withTenant (tenant , () -> log (Level .TRACE , format , arg ));
33
+ }
34
+
35
+ public void trace (String tenant , String format , Object arg1 , Object arg2 ) {
36
+ withTenant (tenant , () -> log (Level .TRACE , format , arg1 , arg2 ));
37
+ }
38
+
39
+ public void trace (String tenant , String format , Object ... arguments ) {
40
+ withTenant (tenant , () -> log (Level .TRACE , format , arguments ));
41
+ }
42
+
43
+ public void trace (String tenant , String msg , Throwable t ) {
44
+ withTenant (tenant , () -> logThrowable (Level .TRACE , msg , t ));
45
+ }
46
+
47
+ public void debug (String tenant , String msg ) {
48
+ withTenant (tenant , () -> log (Level .DEBUG , msg , (Object [])null ));
49
+ }
50
+
51
+ public void debug (String tenant , String format , Object arg ) {
52
+ withTenant (tenant , () -> log (Level .DEBUG , format , arg ));
53
+ }
54
+
55
+ public void debug (String tenant , String format , Object arg1 , Object arg2 ) {
56
+ withTenant (tenant , () -> log (Level .DEBUG , format , arg1 , arg2 ));
57
+ }
58
+
59
+ public void debug (String tenant , String format , Object ... arguments ) {
60
+ withTenant (tenant , () -> log (Level .DEBUG , format , arguments ));
61
+ }
62
+
63
+ public void debug (String tenant , String msg , Throwable t ) {
64
+ withTenant (tenant , () -> logThrowable (Level .DEBUG , msg , t ));
65
+ }
66
+
67
+ public void info (String tenant , String msg ) {
68
+ withTenant (tenant , () -> log (Level .INFO , msg , (Object [])null ));
69
+ }
70
+
71
+ public void info (String tenant , String format , Object arg ) {
72
+ withTenant (tenant , () -> log (Level .INFO , format , arg ));
73
+ }
74
+
75
+ public void info (String tenant , String format , Object arg1 , Object arg2 ) {
76
+ withTenant (tenant , () -> log (Level .INFO , format , arg1 , arg2 ));
77
+ }
78
+
79
+ public void info (String tenant , String format , Object ... arguments ) {
80
+ withTenant (tenant , () -> log (Level .INFO , format , arguments ));
81
+ }
82
+
83
+ public void info (String tenant , String msg , Throwable t ) {
84
+ withTenant (tenant , () -> logThrowable (Level .INFO , msg , t ));
85
+ }
86
+
87
+ public void warn (String tenant , String msg ) {
88
+ withTenant (tenant , () -> log (Level .WARN , msg , (Object [])null ));
89
+ }
90
+
91
+ public void warn (String tenant , String format , Object arg ) {
92
+ withTenant (tenant , () -> log (Level .WARN , format , arg ));
93
+ }
94
+
95
+ public void warn (String tenant , String format , Object arg1 , Object arg2 ) {
96
+ withTenant (tenant , () -> log (Level .WARN , format , arg1 , arg2 ));
97
+ }
98
+
99
+ public void warn (String tenant , String format , Object ... arguments ) {
100
+ withTenant (tenant , () -> log (Level .WARN , format , arguments ));
101
+ }
102
+
103
+ public void warn (String tenant , String msg , Throwable t ) {
104
+ withTenant (tenant , () -> logThrowable (Level .WARN , msg , t ));
105
+ }
106
+
107
+ public void error (String tenant , String msg ) {
108
+ withTenant (tenant , () -> log (Level .ERROR , msg , (Object [])null ));
109
+ }
110
+
111
+ public void error (String tenant , String format , Object arg ) {
112
+ withTenant (tenant , () -> log (Level .ERROR , format , arg ));
113
+ }
114
+
115
+ public void error (String tenant , String format , Object arg1 , Object arg2 ) {
116
+ withTenant (tenant , () -> log (Level .ERROR , format , arg1 , arg2 ));
117
+ }
118
+
119
+ public void error (String tenant , String format , Object ... arguments ) {
120
+ withTenant (tenant , () -> log (Level .ERROR , format , arguments ));
121
+ }
122
+
123
+ public void error (String tenant , String msg , Throwable t ) {
124
+ withTenant (tenant , () -> logThrowable (Level .ERROR , msg , t ));
125
+ }
126
+
127
+ private void withTenant (String tenant , Runnable loggingAction ) {
128
+ String tenantToUse = tenant != null ? tenant : this .tenant ;
129
+ if (tenantToUse == null ) {
130
+ throw new IllegalArgumentException ("Tenant cannot be null" );
131
+ }
132
+ try {
133
+ MDC .put ("tenant" , tenantToUse );
134
+ loggingAction .run ();
135
+ } finally {
136
+ MDC .remove ("tenant" );
137
+ }
138
+ }
139
+
140
+ private void logThrowable (Level level , String msg , Throwable t ) {
141
+ if (locationAwareLogger != null ) {
142
+ locationAwareLogger .log (null , FQCN , toLocationAwareLevel (level ), msg , null , t );
143
+ } else {
144
+ switch (level ) {
145
+ case TRACE : logger .trace (msg , t ); break ;
146
+ case DEBUG : logger .debug (msg , t ); break ;
147
+ case INFO : logger .info (msg , t ); break ;
148
+ case WARN : logger .warn (msg , t ); break ;
149
+ case ERROR : logger .error (msg , t ); break ;
150
+ }
151
+ }
152
+ }
153
+
154
+ private void log (Level level , String format , Object ... args ) {
155
+ if (locationAwareLogger != null ) {
156
+ // Safely handle null arguments array
157
+ Object [] safeArgs = args != null ? args : new Object [0 ];
158
+ locationAwareLogger .log (null , FQCN , toLocationAwareLevel (level ), format , safeArgs , null );
159
+ } else {
160
+ switch (level ) {
161
+ case TRACE :
162
+ if (args == null ) logger .trace (format );
163
+ else logger .trace (format , args );
164
+ break ;
165
+ case DEBUG :
166
+ if (args == null ) logger .debug (format );
167
+ else logger .debug (format , args );
168
+ break ;
169
+ case INFO :
170
+ if (args == null ) logger .info (format );
171
+ else logger .info (format , args );
172
+ break ;
173
+ case WARN :
174
+ if (args == null ) logger .warn (format );
175
+ else logger .warn (format , args );
176
+ break ;
177
+ case ERROR :
178
+ if (args == null ) logger .error (format );
179
+ else logger .error (format , args );
180
+ break ;
181
+ }
182
+ }
183
+ }
184
+
185
+ private void log (Level level , String format , Object arg ) {
186
+ if (locationAwareLogger != null ) {
187
+ locationAwareLogger .log (null , FQCN , toLocationAwareLevel (level ), format , new Object []{arg }, null );
188
+ } else {
189
+ switch (level ) {
190
+ case TRACE : logger .trace (format , arg ); break ;
191
+ case DEBUG : logger .debug (format , arg ); break ;
192
+ case INFO : logger .info (format , arg ); break ;
193
+ case WARN : logger .warn (format , arg ); break ;
194
+ case ERROR : logger .error (format , arg ); break ;
195
+ }
196
+ }
197
+ }
198
+
199
+ private void log (Level level , String format , Object arg1 , Object arg2 ) {
200
+ if (locationAwareLogger != null ) {
201
+ locationAwareLogger .log (null , FQCN , toLocationAwareLevel (level ), format , new Object []{arg1 , arg2 }, null );
202
+ } else {
203
+ switch (level ) {
204
+ case TRACE : logger .trace (format , arg1 , arg2 ); break ;
205
+ case DEBUG : logger .debug (format , arg1 , arg2 ); break ;
206
+ case INFO : logger .info (format , arg1 , arg2 ); break ;
207
+ case WARN : logger .warn (format , arg1 , arg2 ); break ;
208
+ case ERROR : logger .error (format , arg1 , arg2 ); break ;
209
+ }
210
+ }
211
+ }
212
+
213
+ private int toLocationAwareLevel (Level level ) {
214
+ switch (level ) {
215
+ case TRACE : return LocationAwareLogger .TRACE_INT ;
216
+ case DEBUG : return LocationAwareLogger .DEBUG_INT ;
217
+ case INFO : return LocationAwareLogger .INFO_INT ;
218
+ case WARN : return LocationAwareLogger .WARN_INT ;
219
+ case ERROR : return LocationAwareLogger .ERROR_INT ;
220
+ default : throw new IllegalArgumentException ("Unknown level: " + level );
221
+ }
222
+ }
223
+ }
0 commit comments