blob: be19b127e9735e4bcc5d9d0a811d4325c03e12f7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.IO;
using System.Text;
namespace Apache.Geode.DUnitFramework
{
/// <summary>
/// Class to do logging.
/// </summary>
public class UnitLog : IDisposable
{
#region Private members
private string m_file;
private FileStream m_stream;
private bool m_append;
#endregion
public string File
{
get
{
return m_file;
}
set
{
Close();
m_file = value;
Init();
}
}
public bool Append
{
get
{
return m_append;
}
set
{
m_append = value;
}
}
public UnitLog(string file)
{
m_file = file;
m_stream = null;
m_append = true;
}
public UnitLog(string file, bool append)
{
m_file = file;
m_stream = null;
m_append = append;
}
/// <summary>
/// Initialize the log file.
/// </summary>
private void Init()
{
if (m_stream == null)
{
try
{
string dirName = Path.GetDirectoryName(m_file);
if (dirName != null && dirName.Length > 0 && !Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
m_stream = new FileStream(m_file, (m_append ? FileMode.Append :
FileMode.Create), FileAccess.Write, FileShare.ReadWrite);
}
catch (Exception)
{
m_stream = null;
}
}
}
/// <summary>
/// Write the given message to the log file with default encoding.
/// </summary>
/// <param name="message">The message to write.</param>
public void Write(string message)
{
Write(message, Encoding.Default);
}
/// <summary>
/// Write the given message to the log file with the given encoding.
/// </summary>
/// <param name="message">The message to write.</param>
/// <param name="encoding">The encoding of the message.</param>
public void Write(string message, Encoding encoding)
{
Init();
if (m_stream != null)
{
byte[] messageBytes = encoding.GetBytes(message);
int numTries = 3;
while (numTries-- > 0)
{
try
{
m_stream.Seek(0, SeekOrigin.End);
m_stream.Write(messageBytes, 0, messageBytes.Length);
m_stream.Flush();
break;
}
catch
{
System.Threading.Thread.Sleep(50);
}
}
}
}
/// <summary>
/// Close the client side log.
/// </summary>
private void Close()
{
if (m_stream != null)
{
try
{
m_stream.Close();
}
catch
{
}
m_stream = null;
}
}
#region IDisposable Members
/// <summary>
/// Disposer closes the log properly.
/// </summary>
public void Dispose()
{
Close();
GC.SuppressFinalize(this);
}
#endregion
/// <summary>
/// Finalizer for the case when the Disposer is not called.
/// </summary>
~UnitLog()
{
Close();
}
}
}