Платформа журналирования Silverlight и/или лучшие практики

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

25
задан Dave Arkell 24 March 2011 в 10:46
поделиться

6 ответов

Я собираюсь копаться в чем-то подобном сам для продукта, который мы записали. Я рассматриваю использование PostSharp для Silverlight для добавления клиентского входа как аспекта.

я использовал проект NLog с большим успехом прежде под полной Платформой.NET и Компактной Платформой, таким образом, я, скорее всего, возьму существующий код платформы и добавлю некоторые регистрирующиеся цели:

  • Система стандарта А. Цель диагностики, чтобы позволить получить использование DebugView, и т.д.
  • асинхронный веб-сервис предназначаются подобный тому в NLog.
  • изолированное устройство хранения данных предназначаются с задержанной передачей в семантику сервера.

я кратко посмотрел на Помеху, и это, кажется, страдает от одного главного дефекта - это не может зарегистрировать сбой соединения. Так принятие Вашего веб-сервера онлайн все время, да это будет работать, но когда проблемы произойдут в восходящем направлении или на самом сервере, данные регистрации все потеряны и могли бы даже разрушить Ваше приложение.

4
ответ дан Craig Nicholson 28 November 2019 в 21:46
поделиться

Вы также можете использовать это: http://silverlightlogging.codeplex.com/

2
ответ дан LDuys 28 November 2019 в 21:46
поделиться

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

0
ответ дан Aaron Weiker 28 November 2019 в 21:46
поделиться

, если вы просто хотите выводить сообщения отладки на консоль. Вы можете использовать механизм console.log браузера. Я написал для этого метод расширения. Вы можете найти в моем блоге .

    // http://kodierer.blogspot.com.es/2009/05/silverlight-logging-extension-method.html
    public static string Log(string message)
    {
        var msgLog = "";
        try
        {

            HtmlWindow window = HtmlPage.Window;

            //only log if a console is available
            var isConsoleAvailable = (bool)window.Eval("typeof(console) != 'undefined' && typeof(console.log) != 'undefined'");

            if (!isConsoleAvailable) return "isConsoleAvailable " + isConsoleAvailable;

            var createLogFunction = (bool)window.Eval("typeof(ssplog) == 'undefined'");
            if (createLogFunction)
            {
                // Load the logging function into global scope:
                string logFunction = @"function ssplog(msg) { console.log(msg); }";
                string code = string.Format(@"if(window.execScript) {{ window.execScript('{0}'); }} else {{ eval.call(null, '{0}'); }}", logFunction);
                window.Eval(code);
            }

            // Prepare the message
            DateTime dateTime = DateTime.Now;
            string output = string.Format("{0} - {1} - {2}", dateTime.ToString("u"), "DEBUG", message);

            // Invoke the logging function:
            var logger = window.Eval("ssplog") as ScriptObject;
            logger.InvokeSelf(output);
        }
        catch (Exception ex)
        {
            msgLog = "Error Log " + ex.Message;
        }
        return msgLog;

    }
6
ответ дан 28 November 2019 в 21:46
поделиться

Я использую окна JavaScript и делаю его доступным для сценариев в Silverlight. Для «производства» я могу отключить это окно, но все же сохранить строки журнала в памяти, а затем, если что-то пойдет не так, отправить их на сервер. Таким образом, я получаю лучшее из обоих миров - простой журнал в реальном времени на клиенте для отладки и журналы для удаленных посмертных ситуаций, с которыми могут столкнуться пользователи.

0
ответ дан 28 November 2019 в 21:46
поделиться

Если вы готовы на минуту снять шлем космонавта, ниже представлен легкий логгер, который я написал для Silverlight, для ведения логов на стороне клиента (в основном для использования с операциями WCF, но может быть для любых ошибок).

Первоначально он использовался в Monotouch для приложений iPhone, и был адаптирован для IsolateStorage. При необходимости можно использовать метод Read для отображения в текстовом поле. Проверено в SL4.

/// <summary>
/// A lightweight logging class for Silverlight.
/// </summary>
public class Log
{
    /// <summary>
    /// The log file to write to. Defaults to "dd-mm-yyyy.log" e.g. "13-01-2010.log"
    /// </summary>
    public static string LogFilename { get; set; }

    /// <summary>
    /// Whether to appendthe calling method to the start of the log line.
    /// </summary>
    public static bool UseStackFrame { get; set; }

    static Log()
    {
        LogFilename = string.Format("{0}.log", DateTime.Today.ToString("dd-MM-yyyy"));
        UseStackFrame = false;
    }

    /// <summary>
    /// Reads the entire log file, or returns an empty string if it doesn't exist yet.
    /// </summary>
    /// <returns></returns>
    public static string ReadLog()
    {
        string result = "";
        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForSite();

        if (storage.FileExists(LogFilename))
        {
            try
            {
                using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(LogFilename,FileMode.OpenOrCreate,storage))
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        result = reader.ReadToEnd();
                    }
                }
            }
            catch (IOException)
            {
                // Ignore
            }
        }

        return result;
    }

    /// <summary>
    /// Writes information (not errors) to the log file.
    /// </summary>
    /// <param name="format">A format string</param>
    /// <param name="args">Any arguments for the format string.</param>
    public static void Info(string format, params object[] args)
    {
        WriteLine(LoggingLevel.Info, format, args);
    }

    /// <summary>
    /// Writes a warning (non critical error) to the log file
    /// </summary>
    /// <param name="format">A format string</param>
    /// <param name="args">Any arguments for the format string.</param>
    public static void Warn(string format, params object[] args)
    {
        WriteLine(LoggingLevel.Warn, format, args);
    }

    /// <summary>
    /// Writes a critical or fatal error to the log file.
    /// </summary>
    /// <param name="format">A format string</param>
    /// <param name="args">Any arguments for the format string.</param>
    public static void Fatal(string format, params object[] args)
    {
        WriteLine(LoggingLevel.Fatal, format, args);
    }

    /// <summary>
    /// Writes the args to the default logging output using the format provided.
    /// </summary>
    public static void WriteLine(LoggingLevel level, string format, params object[] args)
    {
        string message = string.Format(format, args);

        // Optionally show the calling method
        if (UseStackFrame)
        {
            var name = new StackFrame(2, false).GetMethod().Name;

            string prefix = string.Format("[{0} - {1}] ", level, name);
            message = string.Format(prefix + format, args);
        }

        Debug.WriteLine(message);
        WriteToFile(message);
    }

    /// <summary>
    /// Writes a line to the current log file.
    /// </summary>
    /// <param name="message"></param>
    private static void WriteToFile(string message)
    {
        try
        {
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForSite();
            bool b = storage.FileExists(LogFilename);

            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(LogFilename,FileMode.Append,storage))
            {
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("[{0}] {1}", DateTime.UtcNow.ToString(), message);
                }
            }
        }
        catch (IOException)
        {
            // throw new Catch22Exception();
        }
    }
}

/// <summary>
/// The type of error to log.
/// </summary>
public enum LoggingLevel
{
    /// <summary>
    /// A message containing information only.
    /// </summary>
    Info,
    /// <summary>
    /// A non-critical warning error message.
    /// </summary>
    Warn,
    /// <summary>
    /// A fatal error message.
    /// </summary>
    Fatal
}
14
ответ дан 28 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: