2010-04-09 6 views
7

Google guice a un built-in logger binding. Mais que se passe-t-il si je veux utiliser un log-logging ou log4j logger?Comment puis-je obtenir google guice pour injecter un enregistreur personnalisé, par exemple un enregistreur de consignation ou un log4j logger

Puis-je obtenir Guice pour injecter un journal créé par

LogFactory.getLog(CLASS.class) 

Mais ayant le même comportement que intégré dans la liaison:

La liaison fixe automatiquement le nom de l'enregistreur au nom de la classe dans laquelle l'enregistreur est injecté ..


Cela a-t-il même un sens? Ou crier que j'utilise simplement le Logger java intégré? Ou utilisez-vous simplement l'enregistrement des communs sans injections?

+0

Non, c'est logique. Log4j prend en charge plus de niveaux de journalisation et a plus d'appenders disponibles, donc vouloir l'utiliser à la place de l'enregistreur intégré est tout à fait logique pour moi. –

Répondre

11

La page CustomInjections du wiki de Guice décrit exactement comment injecter un enregistreur nommé par la classe dans laquelle il est injecté.

+0

Nice link. Une sorte de processus douloureux, mais fonctionnel néanmoins. –

+0

Merci pour le lien. Cela a fonctionné pour moi. J'ai utilisé cette stratégie pour implémenter une solution SLF4J. –

+3

Pour tous ceux qui sont confus au sujet de la classe InjectLogger dans l'exemple: Créez simplement une classe Annotation vide nommée "InjectLogger" dans votre projet. Ce n'est pas une dépendance externe (c'est ce que j'ai supposé en premier). –

1

C'est votre choix. J'ai utilisé avec succès logback avec Guice en utilisant la méthode détaillée sur le wiki. Voir le projet sli4j. Cela pourrait être utile.

0

Guice est très utile pour l'injection de différentes implémentations d'une interface. Ce n'est pas le cas ici car les différentes implémentations de journalisation ont toutes des API différentes.

Si vous voulez pouvoir échanger l'implémentation de journalisation réelle plus tard en cours de développement par rapport à une interface, utilisez commons logging ou slf4j.

+0

Hibernate utilise SLF4J et j'ai intégré les deux dans une application basée sur Guice sans aucun problème, donc je peux le recommander, même si je n'ai pas joué avec la journalisation des communs. –

0

Bien que vous ne pouvez pas remplacer l'enregistreur fourni java.util.logging.Logger, vous liez un nouvel enregistreur comme vous le feriez pour tout autre classe:

bind(Log.class).to(LogFactory.getLog(YourClass)); // or toInstance(...); 

Mais, la création d'un enregistreur nommé va être un peu plus difficile.

Si vous explorez le code de Google Guice (til.BinderImpl.java:87), vous pouvez voir comment ils affectent un nom de classe distinct pour chaque instance de l'enregistreur qui a été injecté. Cependant, je ne l'ai pas inspecté assez attentivement pour savoir s'il est facilement reproductible.

Il peut être possible de créer un fournisseur ou d'injecter une fabrique qui a en quelque sorte accès au contexte afin que vous puissiez fournir un enregistreur nommé.

+0

Je ne comprends pas cela. Si vous définissez explicitement YourClass dans un classeur, vous obtenez les journaux de la même classe pour l'ensemble de l'application. –

Questions connexes