[logback-user] Substituting class/method names in logback log files with original names when deploying obfuscated code

Christopher BROWN brown at reflexe.fr
Mon Dec 5 14:27:03 CET 2011

Hello Ceki,

Thanks for that information.  After looking into your suggestions, it seems
the most straightforward way to intercept this is by accessing *
PatternLayout.defaultConverterMap* at application startup to install either
an overriding or alternative converter in the *Map<String,String>*, most
likely by basing the implementation on *ClassOfCallerConverter*.

However, this led me onto the conversion "*%ex*" which seems to be
implemented by *ThrowableProxyConverter*, and I'm guessing I need to do
some work here too: I'm guessing I need to provide an implementation of *
IThrowableProxy*, such as a subclass of *ThrowableProxy* that overrides *
getStackTraceElementProxyArray()*?  Here, I'm guessing I'd need to call *
super.getStackTraceElementProxyArray()* and build an equivalent array of
proxies whenever the underlying stack trace elements refer to a package I
know to be obfuscated.  Would that be correct?  If so, where and how can I
install my implementation of *IThrowableProxy*?

As for the example you cited with ConversionRuleAction, I'm guessing it's
the "cleanest" approach to the API (no assumptions about layout or encoder)
but requiring the use of Joran/XML configuration?

Thanks again,

On 5 December 2011 13:49, ceki <ceki at qos.ch> wrote:

> Hi Christopher,
> It think writing a custom conversion specifier [1] is really the way
> to go here.  Let's assume the converter is called
> ObfuscatedClassConverter.  You would place the mapping in
> ObfuscatedClassConverter or in some other resource that
> ObfuscatedClassConverter looks up at run time. Once
> ObfuscatedClassConverter has the class mapping it would output caller
> class name similar to what ClassOfCallerConverter [2] does.
> As discussed in [1], you can register a conversion specifier in a
> configuration file. You can also register a specifier programmatically
> by populating the pattern rule registry. See ConversionRuleAction [3]
> for details. Alternatively, you could also access PatternLayout's
> defaultConverterMap directly.
> HTH,
> [1] http://logback.qos.ch/manual/**layouts.html#**
> customConversionSpecifier<http://logback.qos.ch/manual/layouts.html#customConversionSpecifier>
> [2] http://logback.qos.ch/xref/ch/**qos/logback/classic/pattern/**
> ClassOfCallerConverter.html<http://logback.qos.ch/xref/ch/qos/logback/classic/pattern/ClassOfCallerConverter.html>
> [3] http://logback.qos.ch/xref/ch/**qos/logback/core/joran/action/**
> ConversionRuleAction.html<http://logback.qos.ch/xref/ch/qos/logback/core/joran/action/ConversionRuleAction.html>
> --
> Ceki
> http://twitter.com/#!/ceki
> On 05.12.2011 12:26, Christopher BROWN wrote:
>> Hello,
>> I've not yet found an answer to my question (I did get some suggestions
>> back but no solution), so if anyone can help...
>> So far, by investigating myself, it appears that I could either replace
>> PatternLayout (but that means basically forking code with all the
>> associated drawbacks) or use something like ClassicConverter (but I
>> didn't see how do override just the parts of the layout I need, the ANSI
>> colour example wraps the whole line... maybe I missed something).  The
>> conversion word "replace" doesn't seem to be a scalable solution (and
>> furthermore, it's static whereas the application is OSGi-based therefore
>> JARs can be reloaded at runtime with modified contents).
>> I'm stuck!
>> One suggestion I did get back was to keep the obfuscated code mapping
>> outside of the runtime environment, and decode "in house" stacktraces
>> when a customer sends us log files containing stacktraces with
>> obfuscated class/method names.  This suggestion does not provide the
>> solution, as we can't be sure that we match versions (version reported
>> by customer and version of class/method name mappings), so the "package
>> the mapping file in the JAR" is still the most reliable from that point
>> of view.
>> Also, another reply pointed out that if the mapping is in the JAR, then
>> it effectively renders useless the obfuscation: regarding that remark,
>> yes, it makes it easier to restore the original source code, however the
>> aim isn't a naive "total security" approach, it's primarily to
>> discourage casual use and most of all, to encourage our customers not to
>> link to obfuscated code, as we deliver a public non-obfuscated API, and
>> it's a way of discouraging people taking shortcuts (because they
>> unfortunately do and they can end up making their own code more prone to
>> breakage by fiddling with internals and by having things change during
>> upgrades).
>> So a solution remains relevant.
>> Thanks,
>> Christopher
>> On 28 November 2011 16:31, Christopher BROWN <brown at reflexe.fr
>> <mailto:brown at reflexe.fr>> wrote:
>>    Hello,
>>    What would be the best way to handle logging with logback when
>>    deploying obfuscated code?
>>    For example, with YGuard, when the obfuscator runs, it outputs a
>>    mapping file of obfuscated code (class names, method names, etc) to
>>    unobfuscated code.  When a stacktrace or just any logging trace is
>>    output, the class/method names are obviously obfuscated.  As it's
>>    possible to deploy this mapping with the code, say embedded in the
>>    same ".jar", all the information I would need is available.
>>    Without too much re-writing of code (default formatting with
>>    logback), what would be the best way to dynamically replace matching
>>    class/method names?
>>    Thanks,
>>    Christopher
>>  ______________________________**_________________
> Logback-user mailing list
> Logback-user at qos.ch
> http://mailman.qos.ch/mailman/**listinfo/logback-user<http://mailman.qos.ch/mailman/listinfo/logback-user>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.qos.ch/pipermail/logback-user/attachments/20111205/10648a79/attachment.html>

More information about the Logback-user mailing list