J'écris une classe de journalisation et j'aimerais pouvoir obtenir le nom de la classe qui a l'appel à Helper.Log(string message)
. Est-ce possible en utilisant la réflexion et C#?Est-il possible d'obtenir le nom de classe en cours d'exécution en utilisant la réflexion?
Répondre
Oui, c'est assez facile.
Helper.Log("[" + this.GetType().Name + "]: " + message);
Notez que si votre classe d'enregistreur est vraiment une enveloppe autour d'un cadre de l'exploitation forestière (comme log4net ou NLog), le cadre de l'exploitation forestière peut être configuré pour obtenir la classe d'appel/méthode pour vous. Pour que cela fonctionne correctement, vous devez envelopper correctement la structure de journalisation. Pour NLog et log4net, l'encapsulation correcte (pour préserver les informations de site d'appel) implique généralement l'utilisation de la méthode "Log" (plutôt que les variantes Error, Warn, Info, etc) et le "logger type" comme premier paramètre. Le "type de consignateur" est le type de votre enregistreur qui enveloppe le consignateur de la structure de consignation.
Voici une façon d'envelopper NLog (taken from here):
class MyLogger
{
private Logger _logger;
public MyLogger(string name)
{
_logger = LogManager.GetLogger(name);
}
public void WriteMessage(string message)
{
///
/// create log event from the passed message
///
LogEventInfo logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, message);
// Call the Log() method. It is important to pass typeof(MyLogger) as the
// first parameter. If you don't, ${callsite} and other callstack-related
// layout renderers will not work properly.
//
_logger.Log(typeof(MyLogger), logEvent);
}
}
Et voici comment vous pouvez le faire avec log4net:
class MyLogger
{
private ILog _logger;
public MyLogger(string name)
{
_logger = LogManager.GetLogger(name);
}
public void WriteMessage(string message)
{
// Call the Log() method. It is important to pass typeof(MyLogger) as the
// first parameter. If you don't, ${callsite} and other callstack-related
// formatters will not work properly.
//
_logger.Log(typeof(MyLogger), LogLevel.Info, message);
}
}
Pour la méthode statique voir http://stackoverflow.com/questions/9326278/comment-obtenir-la-nom-classe-courante-dans-une-statique-méthode – qub1n