You could write a converter like this:
public sealed class HexPatternConverter : PatternLayoutConverter
{
override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
long id;
if (long.TryParse(loggingEvent.ThreadName, out id))
{
writer.Write(id.ToString("X"));
}
else
{
writer.Write(loggingEvent.ThreadName);
}
}
}
then you configure the layout like this:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%hex_thread] %message%newline" />
<converter>
<name value="hex_thread" />
<type value="YourNamespace.HexPatternConverter" />
</converter>
</layout>
Obviously you can use this converter in your pattern as you see fit and you will also need to tweak the converter so that it prints the hex value exactly as you want it.