I have the following codes:
MySuperClass
package com.mypackage;
public abstract class MySuperClass {
private static final Logger LOGGER = LogManager.getLogger();
protected void demoLog() {
LOGGER.debug("My message")
}
}
MyClass
package com.mypackage;
public class MyClass extends MySuperClass {
public void executeLog() {
demoLog();
}
}
When com.mypackage.MyClass#executeLog
method executes it prints:
2018-07-24 10:39:04,964 : DEBUG : : com.mypackage.MySuperClass : demoLog : My message
In the log message, the Emitter is com.mypackage.MySuperClass
, but I would like to have com.mypackage.MyClass
as the Emitter.
com.mypackage.MySuperClass
is extended by multiple class- I cannot pass
Class
as argument to theLogManager.getLogger()
by callinggetClass()
fromMySuperClass
since it isstatic
. To me usingstatic
is a good idea, as the actual implementation is in JSF Managed Bean.
How can I achieve this?
There is a similar question was asked here: Java Logging With Abstract Classes, but it is not providing me with a solution.
Update - 1
- If the
Logger
inMySuperClass
is defined asprivate final Logger logger = LogManager.getLogger(getClass());
, still the Emitter iscom.mypackage.MySuperClass
. If I define
protected abstract Logger getLogger();
in
MySuperClass
and implement it asprivate final Logger logger = LogManager.getLogger(getClass()); @Override protected Logger getLogger() { return logger; }
in
MyClass
the Emitter is the same, i.e.,com.mypackage.MySuperClass
.
Update - 2
If I define
protected abstract Logger getLogger();
in MySuperClass
and implement it as
private final Logger logger = LogManager.getLogger(MyClass.class);
@Override
protected Logger getLogger() {
return logger;
}
in MyClass
the Emitter is the same, i.e., com.mypackage.MySuperClass
.