/***************************************************************************

    supportware
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


#ifndef DDLOGMANAGER_H
#define DDLOGMANAGER_H

#include <ddstring.h>
#include <vector>
#include <fstream>
#include <map>

class ddthreadmutex;
class ddlogmanager;

/// ddlogdevice : eine sammlung von iostreams welche die log-level( debug, error etc) darstellen.
/**
	Ein logdevice verwaltet verschiedene iostreams, welche die 
	log-level darstellen. Fürs "native logging" von ddbaseobject gibts
	log_debug & log_error, für die einzelnen sites noch zusätzlich
	log_main, log_admin & log_chat.
*/

class ddlogdevice
{

friend class ddlogmanager;

public: 
	
	enum dd_loglevel
	{	
		lg_debug=0,
		lg_error=1,
		lg_main=2,
		lg_admin=3,
		//lg_chat=4,
		lg_search=4,
		lg_size
	};
	
	ddlogdevice();
	virtual ~ddlogdevice();

	void log_message( int level, const ddstring& message );

protected:
	
	void add_log_stream( int idx, const ddstring& name );	
	void rotate_log_streams( time_t lasttime );
		
	ddthreadmutex			*_logmutex;
	vector<ofstream*> _streams;
	vector<ddstring>  _filenames;

};


/***************************************************************************

    supportware
    Copyright (C) 2001-2008 by c.holzheuer
    c.holzheuer@sourceworx.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

***************************************************************************/


typedef map<ddstring, ddlogdevice*> ddlogmap;

/// ddlogmanager : verwaltet die logdevices.
/**
	Der Logmanager ist ein (statisches) singleton, auf das die ddbaseobject::log
	methoden zugreifen, so dass jedes ddbaseobject jederzeit meldungen loggen kann.
	(von log4j geklaut)
	Die globalen log-aufrufe schreiben logischerweise in die application-globalen
	logfiles.
	Für das ebenso notwendige domain-spezifische logging können zusätzliche logdevices
	angelegt werden, die dann "per name" angesprochen werden.  
*/

class ddlogmanager
{

public: 

	ddlogmanager();
	virtual ~ddlogmanager();
	
	void log_message( int level, const ddstring& message );
	void log_message( const ddstring& domainname, int level, const ddstring& message );

	void add_log_domain( const ddstring& domainname, const ddstring& path );	
	void rotate_log_streams( time_t lasttime );
	
protected:
	
	ddlogdevice _mainlog;
	ddlogmap 		_domainlogs;
};



#endif
