134 lines
4.6 KiB
C++
134 lines
4.6 KiB
C++
|
/*
|
||
|
==============================================================================
|
||
|
|
||
|
This file is part of the JUCE library.
|
||
|
Copyright (c) 2017 - ROLI Ltd.
|
||
|
|
||
|
JUCE is an open source library subject to commercial or open-source
|
||
|
licensing.
|
||
|
|
||
|
The code included in this file is provided under the terms of the ISC license
|
||
|
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||
|
To use, copy, modify, and/or distribute this software for any purpose with or
|
||
|
without fee is hereby granted provided that the above copyright notice and
|
||
|
this permission notice appear in all copies.
|
||
|
|
||
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||
|
DISCLAIMED.
|
||
|
|
||
|
==============================================================================
|
||
|
*/
|
||
|
|
||
|
namespace juce
|
||
|
{
|
||
|
|
||
|
FileLogger::FileLogger (const File& file,
|
||
|
const String& welcomeMessage,
|
||
|
const int64 maxInitialFileSizeBytes)
|
||
|
: logFile (file)
|
||
|
{
|
||
|
if (maxInitialFileSizeBytes >= 0)
|
||
|
trimFileSize (logFile, maxInitialFileSizeBytes);
|
||
|
|
||
|
if (! file.exists())
|
||
|
file.create(); // (to create the parent directories)
|
||
|
|
||
|
String welcome;
|
||
|
welcome << newLine
|
||
|
<< "**********************************************************" << newLine
|
||
|
<< welcomeMessage << newLine
|
||
|
<< "Log started: " << Time::getCurrentTime().toString (true, true) << newLine;
|
||
|
|
||
|
FileLogger::logMessage (welcome);
|
||
|
}
|
||
|
|
||
|
FileLogger::~FileLogger() {}
|
||
|
|
||
|
//==============================================================================
|
||
|
void FileLogger::logMessage (const String& message)
|
||
|
{
|
||
|
const ScopedLock sl (logLock);
|
||
|
DBG (message);
|
||
|
FileOutputStream out (logFile, 256);
|
||
|
out << message << newLine;
|
||
|
}
|
||
|
|
||
|
void FileLogger::trimFileSize (const File& file, int64 maxFileSizeBytes)
|
||
|
{
|
||
|
if (maxFileSizeBytes <= 0)
|
||
|
{
|
||
|
file.deleteFile();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
const int64 fileSize = file.getSize();
|
||
|
|
||
|
if (fileSize > maxFileSizeBytes)
|
||
|
{
|
||
|
TemporaryFile tempFile (file);
|
||
|
|
||
|
{
|
||
|
FileOutputStream out (tempFile.getFile());
|
||
|
FileInputStream in (file);
|
||
|
|
||
|
if (! (out.openedOk() && in.openedOk()))
|
||
|
return;
|
||
|
|
||
|
in.setPosition (fileSize - maxFileSizeBytes);
|
||
|
|
||
|
for (;;)
|
||
|
{
|
||
|
const char c = in.readByte();
|
||
|
if (c == 0)
|
||
|
return;
|
||
|
|
||
|
if (c == '\n' || c == '\r')
|
||
|
{
|
||
|
out << c;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
out.writeFromInputStream (in, -1);
|
||
|
}
|
||
|
|
||
|
tempFile.overwriteTargetFileWithTemporary();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//==============================================================================
|
||
|
File FileLogger::getSystemLogFileFolder()
|
||
|
{
|
||
|
#if JUCE_MAC
|
||
|
return File ("~/Library/Logs");
|
||
|
#else
|
||
|
return File::getSpecialLocation (File::userApplicationDataDirectory);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
FileLogger* FileLogger::createDefaultAppLogger (const String& logFileSubDirectoryName,
|
||
|
const String& logFileName,
|
||
|
const String& welcomeMessage,
|
||
|
const int64 maxInitialFileSizeBytes)
|
||
|
{
|
||
|
return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName)
|
||
|
.getChildFile (logFileName),
|
||
|
welcomeMessage, maxInitialFileSizeBytes);
|
||
|
}
|
||
|
|
||
|
FileLogger* FileLogger::createDateStampedLogger (const String& logFileSubDirectoryName,
|
||
|
const String& logFileNameRoot,
|
||
|
const String& logFileNameSuffix,
|
||
|
const String& welcomeMessage)
|
||
|
{
|
||
|
return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName)
|
||
|
.getChildFile (logFileNameRoot + Time::getCurrentTime().formatted ("%Y-%m-%d_%H-%M-%S"))
|
||
|
.withFileExtension (logFileNameSuffix)
|
||
|
.getNonexistentSibling(),
|
||
|
welcomeMessage, 0);
|
||
|
}
|
||
|
|
||
|
} // namespace juce
|