aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Logging/FileLogger.cs
blob: 547db406e3a4f5198c691475ca45784334c473b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.Logging
{
    /// <summary>
    /// Represents an <see cref="ILogger"/> file logger.
    /// </summary>
    /// <seealso cref="Tango.Logging.ILogger" />
    public class FileLogger : ILogger
    {
        private DateTime _logFileDate;

        /// <summary>
        /// Gets the logs folder.
        /// </summary>
        public static String DefaultLogsFolder { get; private set; }

        /// <summary>
        /// Gets or sets the log file.
        /// </summary>
        public String LogFile { get; private set; }

        /// <summary>
        /// Gets the tag name which will be appended to the file.
        /// </summary>
        public String Tag { get; private set; }

        /// <summary>
        /// Gets or sets the log file folder.
        /// </summary>
        public String Folder { get; private set; }

        /// <summary>
        /// Initializes the <see cref="FileLogger"/> class.
        /// </summary>
        static FileLogger()
        {
            DefaultLogsFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Twine", "Tango", "Logs", Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName));
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="FileLogger"/> class.
        /// </summary>
        public FileLogger()
        {
            _isEnabled = true;

            Tag = Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);
            Folder = DefaultLogsFolder;
            Directory.CreateDirectory(Folder);
            LogFile = CreateLogFileName();
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="FileLogger"/> class.
        /// </summary>
        /// <param name="folder">Logs folder path.</param>
        /// <param name="tag">The tag name which will be appended to the file name.</param>
        public FileLogger(String folder, String tag)
            : this()
        {
            Folder = folder;
            Tag = tag;
            Directory.CreateDirectory(Folder);
            LogFile = CreateLogFileName();
        }

        /// <summary>
        /// Called when a new library trace is available.
        /// </summary>
        /// <param name="output">The output.</param>
        public void OnLog(LogItemBase output)
        {
            try
            {
                if (DateTime.Now.Date > _logFileDate.Date)
                {
                    File.AppendAllText(LogFile, Environment.NewLine + Environment.NewLine + "### This log file continues on the next log file ###" + Environment.NewLine);
                    LogFile = CreateLogFileName();
                    File.AppendAllText(LogFile, "### This log file is a continuation of a previous log file ###" + Environment.NewLine + Environment.NewLine);
                }

                File.AppendAllText(LogFile, output.ToString() + Environment.NewLine);
            }
            catch
            {
                Debug.WriteLine("Error Writing To Log File!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            }
        }

        private bool _isEnabled;
        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="ILogger" /> is enabled.
        /// </summary>
        public bool Enabled
        {
            get
            {
                return _isEnabled;
            }
            set
            {
                _isEnabled = value;
            }
        }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="ILogger" /> will be notified about logs without waiting for the logs queue.
        /// </summary>
        public bool Immediate { get; set; }

        /// <summary>
        /// Creates the name of the log file.
        /// </summary>
        /// <returns></returns>
        private String CreateLogFileName()
        {
            _logFileDate = DateTime.Now.Date;
            return Path.Combine(Folder, string.Format("{1}-{0:dd-MM-yyyy_HH-mm-ss}.log", DateTime.Now, Tag));
        }
    }
}