[slf4j-dev] slf4j i8ln

Pete Muir pmuir at redhat.com
Wed Aug 19 20:29:38 CEST 2009


On 19 Aug 2009, at 19:18, Ceki Gulcu wrote:

> Comments inline.
>
> Pete Muir wrote:
>> Hi,
>> As discussed here https://jira.jboss.org/jira/browse/WBRI-290, we  
>> would like to switch to slf4j as our logger (it offers a logging  
>> facade, supports MDC/NDC and parameter replacement).
>> However, as Takeshi highlights here https://jira.jboss.org/jira/browse/WBRI-214 
>> , a needed feature is explicit i8n support, and it sounds like Ceki  
>> would be happy to accept a contribution for this directly to the  
>> slf4j.
>
> Indeed. Assuming we can design a useful i18n extension to sfl4j, I  
> would like it to ship within the slf4j distribution.
>
>> Perhaps, to get started, we should discuss the overall design and  
>> aims. In the linked issue, Takeshi adds three features in the patch:
>> - ability to localize a message by providing a resource bundle,  
>> which has the same name as the class using the logger (the  
>> declaring class)
>
> Using resource bundles for localization make sense.

I like Ralphs suggestion of abstracting this behind a interface and  
providing a default impl based on ResourceBundle.

> I am unsure whether the resource bundle should be related to a  
> logger's name but we can come back to this later.
>
>> - the ability to log an enum value (rather than using a static to  
>> hold the message/key)
>
> Using emums? Interesting. How could enums be used instead of String  
> as enum is not a specific type in itself (in the same way as class  
> is not a type in itself).
>

Sorry, I was being loose with my language. I meant using an enumerated  
type such as

enum LogMessages {

    WRONG_PASSWORD, RIGHT_PASSWORD
}

log.warn(WRONG_PASSWORD);

> What do you mean by static? Perhaps you meant to say String instead  
> of static?

I meant a static String like

class LogMessages {

public static final String WRONG_PASSWORD = "com.acme.WrongPassword";
}

>
>> - the ability to associate the level at which to log with the  
>> message with the enum (via an annotation) rather than in the call  
>> from the declaring class
>
> Takeshi mentioned that his requirement was to be able to change the  
> level of a logging statement without needing to recompile his  
> application. I don't see how annotations help in this case since  
> they also need to be recompiled.
>
> Markers allow for a cleaner way of filtering out messages. Changing  
> the level is unnecessary. For example, if all logging events of  
> level ERROR trigger an alarm, and if a certain ERROR event should  
> not trigger an alarm, you can mark that particular event with the  
> "NO_ALARM" marker.

Yes, I'm also not sure that this is necessary, and it's certainly  
another concern not really relating to i8n IMO.

>
> Instead of debating the requirements, how about code that embodies  
> your vision of the API (assuming everything was possible)?

Hehe, sure, I definitely like to understand the requirements properly  
first, but I know others prefer a hack first approach :-)

>
> For example, here is a vision of the i18n API:
>
>  LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
>  lc.addResourceBundle( aResourceBundle);
>
>  Logger loggerA =  LoggerFactory.getLogger("A");
>  Logger loggerB =  LoggerFactory.getLogger("B");
>
>  // replace key_0 with its corresponding value in aResourceBundle
>  loggerA.info("key_0");
>
>  // same as before, but also insert the value of "param" as  
> specified in
>  // the message
>  loggerB.info("key_1", param);
>
> The above is just an *example* of what I mean by "vision" of the API.
>
> You can go a step further an implement something. You may wish to  
> fork SLF4J on git. The url is http://github.com/ceki/slf4j/tree/master

Sounds like a good idea. I'll talk to Takeshi.

>
>> (Takeshi, correct me if this is incorrect). I think we can probably  
>> separate these features out when discussing.
>> I think we would also need:
>> - ability to specify the resource bundle to use when getting the  
>> logger
>> - ability to use statics fields or just a string id embedded in  
>> call to logger
>
> Static field of type String? If the field is of type String, it does  
> not matter whether the variable is an instance variable of a static  
> one. (In a nutshell, I don't get it.)

Yes, it has no practical impact on the implementation of course :-)




More information about the slf4j-dev mailing list