Avatar billede sph1nx Nybegynder
14. maj 2009 - 20:43 Der er 12 kommentarer og
1 løsning

Logging for helt project

Jeg skal bruge den gode idé til en måde hvorpå jeg kan lave logging funktionalitet, og vise det i et vindue når brugeren vil have det. Problemet er det at jeg har en "solution" i visual studio. og nogle under projekter (class library, wpf application osv) og jeg vil gerne mulighed for at skrive til loggen fra alle projects af. Nogle der har en god ide til hvordan det kan fixes ?
Avatar billede sirius Nybegynder
14. maj 2009 - 20:46 #1
kommer lidt an på hvordan du har valgt at opbygge din arkitektur.

Hvis du har et datalag kunne du lave funktionalitet til at gemme og læse logbeskeder der, og så gøre disse metoder tilgængelige gennem din forretningslogik.

Du kan også lave et seperat project til at håndtere din logning, så kunne alle dine andre projekter have reference til dette projekt og bruge funktionaliteten deri.
Avatar billede arne_v Ekspert
14. maj 2009 - 20:52 #2
Du boer bruge et logging framework som f.eks. log4net.

Med hensyn til din GUI kan du bruge en appender som gemmer i log fil elle rdatabase og saa lade GUI hente derfra.

Hvis du vil have det true real time, saa skal du bruge en appender som skriver direkte til din GUI. Det er ikke svaert at lave.
Avatar billede sph1nx Nybegynder
14. maj 2009 - 21:22 #3
arne_v :
Ligger du inde med et eksempel på real time appender løsningen ?
Avatar billede arne_v Ekspert
14. maj 2009 - 21:33 #4
Jeg kan nemt lave et. Det er ret trivielt at lave appendere til log4net. Jeg kan foerst kigge paa det om en 3-4 timer.
Avatar billede sph1nx Nybegynder
14. maj 2009 - 23:04 #5
Hvis du gider det, så ville det være verdens klasse, er simpelthen lost i log4net appenders lige pt.
Avatar billede arne_v Ekspert
15. maj 2009 - 03:25 #6
Nå der blev lidt mange filer.

Men her kommer de.
Avatar billede arne_v Ekspert
15. maj 2009 - 03:25 #7
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

using log4net.Appender;
using log4net.Core;

namespace E
{
    public class GuiAppender : BufferingAppenderSkeleton
    {
        private Form1 f;
        public GuiAppender()
        {
            BufferSize = 1;
            f = null;
        }
        public Form1 F
        {
            set
            {
                f = value;   
            }
        }
        protected override void SendBuffer(LoggingEvent[] evts)
        {
            StringBuilder sb = new StringBuilder();
            TextWriter tw = new StringWriter(sb);
            for(int i = 0; i < evts.Length; i++)
            {
                Layout.Format(tw, evts[i]);
            }
            tw.Close();
            if(f != null)
            {
                f.Append(sb.ToString());
            }
        }
    }
}
Avatar billede arne_v Ekspert
15. maj 2009 - 03:26 #8
using System;
using System.Drawing;
using System.Windows.Forms;

namespace E
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponents();
        }
        public void Append(string msg)
        {
            textBox1.Text += msg;
        }
    }
}
Avatar billede arne_v Ekspert
15. maj 2009 - 03:26 #9
using System;
using System.Windows.Forms;

using log4net;
using log4net.Config;
using log4net.Appender;

namespace E
{
    public partial class MainForm : Form
    {
        private ILog log;
        public MainForm()
        {
            InitializeComponents();
            XmlConfigurator.Configure();
            log = LogManager.GetLogger(this.GetType().Name);
        }
        void Button1Click(object sender, EventArgs e)
        {
            Form1 f = new Form1();
            f.Show();
            foreach(IAppender a in log.Logger.Repository.GetAppenders())
            {
                if(a is GuiAppender)
                {
                    ((GuiAppender)a).F = f;
                }
            }
        }
        void Button2Click(object sender, EventArgs e)
        {
            log.Info("Just testing");           
        }
        void Button3Click(object sender, EventArgs e)
        {
            log.Warn("Just testing");           
        }
        void Button4Click(object sender, EventArgs e)
        {
            log.Error("Just testing");           
        }
    }
}
Avatar billede arne_v Ekspert
15. maj 2009 - 03:26 #10
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <log4net>
        <appender name="gui" type="E.GuiAppender">
            <layout type="log4net.Layout.PatternLayout,log4net">
                <conversionPattern value="%d [%t] %-5p %c - %m%n"/>
            </layout>
        </appender>
        <root>
            <level value="ALL"/>
            <appender-ref ref="gui"/>
        </root>
        <logger name="E.MainClass">
            <level value="ALL"/>
        </logger>
    </log4net>
</configuration>
Avatar billede arne_v Ekspert
15. maj 2009 - 03:49 #11
Jeg er ikke helt sikker på at en BufferingAppenderSkeleton med BufferSize 1 er smart, men det er tilrettet udfra noget andet kode som jeg havde på lager.
Avatar billede sph1nx Nybegynder
15. maj 2009 - 08:17 #12
Mange mange tak, kan se jeg var kommet meget af vejen.. Smid et svar arne_v
Avatar billede arne_v Ekspert
15. maj 2009 - 14:51 #13
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester