2009-07-13 6 views
-1

Je veux log linenumber à mon fichier journal, en utilisant log4net.the les détails de configuration de log4net est écrit par programmation.i essayé hell out chose pour obtenir le numéro de ligne à être connecté mais aider moins, voici mon codepour enregistrer le numéro de ligne dans mon application par programme

privé IAppender CreateFileAppender (nom de chaîne, string fileName) {

 PatternLayout layout = new PatternLayout();    
     //layout.ConversionPattern = "%d{MM/dd/yy HH:mm:ss} %line %-5p : %m%n"; 
     //layout.ConversionPattern = "%d{MM/dd/yy HH:mm:ss} 5p [%t] (%F:%L) - %m%n"; 
     layout.ConversionPattern = "%5p %d{yyyy-MM-dd hh:mm:ss tt} (%c:%L) - [%X   {UserIdentityName}] %m%n"; 
     layout.ActivateOptions(); 
     FileAppender appender = new FileAppender(layout, HCVIEWERLOG_FILENAME, true); 
     appender.Layout = layout; 
     appender.Name = HCVIEWERLOG_APPENDER; 
     appender.File = HCVIEWERLOG_FILENAME; 
     appender.AppendToFile = true;   
     string[] Args = Environment.CommandLine.Split 
      ("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);    
     foreach(string txt in Args) 
      appender.Threshold = txt.ToString().ToUpper().Contains("DEBUG") ? 
      log4net.Core.Level.Debug : log4net.Core.Level.Off; 
     appender.ActivateOptions(); 
        return (appender as IAppender); 
    } 

même j'ai essayé d'obtenir le numéro de ligne à l'aide stacktrace mais im obtenir la valeur 0. ici est le code

chaîne protégée GetLogMessage (message string) {

 StackTrace stackTrace = new StackTrace(true); 
     StackFrame stackFrame = stackTrace.GetFrame(3); 
     return (stackFrame.GetMethod().DeclaringType.Name 
      + "|" + stackFrame.GetMethod().Name 
      + "|" + **stackFrame.GetFileLineNumber()** 
      + "||||" + message); 
    } 

Répondre

3

deux choses:

1) Assurez-vous que les fichiers pdb sont présents, sinon vous aurez toujours un zéro.

2) Veillez à récupérer le cadre de pile correct. Le cadre de pile actuel est le zéro. Au fur et à mesure que vous avancez dans la pile, vous progresserez dans votre code, MAIS au-dessus de votre code sur la pile, il y aura une charge d'appels de framework pour démarrer l'application, et ceux-ci auront un numéro de ligne zéro.

Ce morceau de code illustre ceci:

static void Main(string[] args) 
{ 
    WriteOutStack(); 
    Console.ReadLine(); 
} 

public static void WriteOutStack() 
{ 
    StackTrace stackTrace = new StackTrace(true); 
    for (int i = 0; i < (stackTrace.FrameCount); i++) 
    { 
     StackFrame stackFrame = stackTrace.GetFrame(i); 
     Console.WriteLine("{0}.{1} ({2})", 
      stackFrame.GetMethod().DeclaringType.Name, 
      stackFrame.GetMethod().Name, 
      stackFrame.GetFileLineNumber()); 
    } 
} 

SORTIE:

Program.WriteOutStack (20) 
Program.Main (15) 
AppDomain._nExecuteAssembly (0) 
HostProc.RunUsersAssembly (0) 
ExecutionContext.Run (0) 
ThreadHelper.ThreadStart (0) 

La sortie ci-dessus montre qu'une fois que j'ai marché à travers les deux couches qui constituent mon code, je suis dans le cadre lui-même pour lequel aucun numéro de ligne n'est disponible.

La principale raison pour laquelle je mentionne ceci est que j'ai remarqué, dans votre échantillon, que vous receviez un cadre de pile spécifique (image 3), donc je pensais que ça valait le coup d'augmenter. (En d'autres termes, assurez-vous de ne pas lire la pile à l'envers dans le code roulé à la main que vous avez montré ci-dessus).

+0

merci Rob, J'ai essayé comme vous l'avez mentionné, oui le soulignement de base à être le point 1 mentinoed.pdb fichier devrait être livré avec dll. de ma curiosité, y at-il de toute façon nous pouvons obtenir le numéro de ligne sans utiliser le fichier .pdb? merci encore. –

+0

assez sûr que la réponse est non. sans le pdb, il n'y a rien pour relier vos binaires au code d'origine dont ils sont venus –

1

Si vous expédiez vos fichiers pdb avec vos fichiers .dll vous devriez obtenir les numéros de ligne dans votre trace de la pile.

+0

merci Matt, quand je livre les fichiers .pdb avec dll son fonctionnement, mais nous expédions seulement dll.is là pour obtenir linenumber? merci encore pour votre aide –

+0

La seule façon que vous pouvez faire est de spécifier le numéro de ligne dans le message de journal - il serait donc dans votre code, et vous auriez à le maintenir. Mauvaise idée. Pourquoi ne pas simplement faire en sorte que vos messages soient suffisamment uniques pour que vous puissiez faire un rapide tri dans votre code pour trouver la ligne? –

+0

actuellement impliquée comme vous l'avez mentionné.je pensais avec le numéro de ligne que je vais bien paraître, de toute façon ok maintenant. merci. –