2012-01-06 3 views
3

Я хочу распространять lib, опираясь на интерфейс регистратора SLF4J. Каков наилучший способ получить регистратор, который прекрасно интегрируется в любой другой проект? Извините за неструктурированный стиль вопроса, я все еще пытаюсь понять, как все эти вещи склеены.SLF4J в распространяемой библиотеке, как получить регистратор

В других проектах я всегда использую этот кусок кода, потому что я хочу, чтобы получить пользовательский регистратор:

private final static Logger LOGGER = LoggerFactory.getILoggerFactory().getLogger(NAME_OF_APP); 

Если я создаю класс org.slf4j.impl.StaticLoggerBinder и иметь его другой LIB, делает в нем определен заводе получить используется, даже если я просто позвоню LoggerFactory.getLogger(NAME_OF_APP) или какой-либо завод по умолчанию slf4j используется?

Я хочу, чтобы пользователь мог использовать свой собственный завод и регистратор, и каким образом перенести, и, прежде всего, почему?

ответ

2

Я не уверен, что полностью понимаю, что вы пытаетесь сделать.

SLF4J состоит из двух частей. Сначала API, который вы используете в своем lib для кодирования вызовов регистрации. И, во-вторых, реализация, которую вы используете во время разработки для ведения журнала, но НЕ устанавливайте как зависимость от lib.

Поскольку SLF4J ищет реализации на пути к классу, разработчики, использующие наш lib, могут просто включать любую реализацию, которую они хотят. Иногда это довольно странные способы :-) Они могут использовать ряд готовых реализаций или собственный код. Это зависит от них.

Я не думаю, что вам нужно что-то сделать, кроме как использовать API SLF4J, как есть.

+0

Спасибо, но тогда я не совсем понимаю, где разница между вызовом 'LoggerFactory.getLogger' и' LoggerFactory.getILoggerFactory(). GetLogger'? –

+1

Без копания в API - у меня много первого и ни одного из второго. Я подозреваю, что LoggerFactory.getLogger имеет дело с этим для вас, и вам не нужно беспокоиться об этом. Не кодирование фабрики, если вы не делаете что-то действительно странное. – drekka

0

Я не уверен, что полностью понимаю, каков ваш сценарий.

Но с моей точки зрения, что вы хотите, это распределенный компонент каротажа.

Простой подход, чтобы сделать это приложение-сокет. И полный компонент компонента для распределенного ведения журнала может понравиться писцу Facebook.

2

От http://slf4j.org/manual.html

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class HelloWorld { 
    public static void main(String[] args) { 
    Logger logger = LoggerFactory.getLogger(HelloWorld.class); 
    logger.info("Hello World"); 
    } 
} 

Таким образом, всегда использовать LoggerFactory.getLogger(...). Аргумент позволяет серверу бэкэнда определить поведение возвращаемого вами регистратора.

0

Использование Logger статической обертка из jcabi-log:

import com.jcabi.log.Logger; 
public class MyLibraryClass { 
    public void foo() { 
    Logger.info(this, "some information"); 
    } 
} 

Все журналы будут отправлены через SLF4J.

Смежные вопросы