You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
5.3 KiB
170 lines
5.3 KiB
// -*- C++ -*-
|
|
// Module: LOG4CPLUS
|
|
// File: socketappender.h
|
|
// Created: 5/2003
|
|
// Author: Tad E. Smith
|
|
//
|
|
//
|
|
// Copyright 2003-2013 Tad E. Smith
|
|
//
|
|
// Licensed 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.
|
|
|
|
/** @file */
|
|
|
|
#ifndef LOG4CPLUS_SOCKET_APPENDER_HEADER_
|
|
#define LOG4CPLUS_SOCKET_APPENDER_HEADER_
|
|
|
|
#include <log4cplus/config.hxx>
|
|
|
|
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
|
|
#pragma once
|
|
#endif
|
|
|
|
#include <log4cplus/appender.h>
|
|
#include <log4cplus/helpers/socket.h>
|
|
#include <log4cplus/thread/syncprims.h>
|
|
#include <log4cplus/thread/threads.h>
|
|
|
|
|
|
namespace log4cplus
|
|
{
|
|
|
|
|
|
#ifndef UNICODE
|
|
std::size_t const LOG4CPLUS_MAX_MESSAGE_SIZE = 8*1024;
|
|
#else
|
|
std::size_t const LOG4CPLUS_MAX_MESSAGE_SIZE = 2*8*1024;
|
|
#endif
|
|
|
|
|
|
/**
|
|
* Sends {@link spi::InternalLoggingEvent} objects to a remote a log server.
|
|
*
|
|
* The SocketAppender has the following properties:
|
|
*
|
|
* <ul>
|
|
*
|
|
* <li>Remote logging is non-intrusive as far as the log event
|
|
* is concerned. In other words, the event will be logged with
|
|
* the same time stamp, NDC, location info as if it were logged
|
|
* locally by the client.
|
|
*
|
|
* <li>SocketAppenders do not use a layout.
|
|
*
|
|
* <li>Remote logging uses the TCP protocol. Consequently, if
|
|
* the server is reachable, then log events will eventually arrive
|
|
* at the server.
|
|
*
|
|
* <li>If the remote server is down, the logging requests are
|
|
* simply dropped. However, if and when the server comes back up,
|
|
* then event transmission is resumed transparently. This
|
|
* transparent reconneciton is performed by a <em>connector</em>
|
|
* thread which periodically attempts to connect to the server.
|
|
*
|
|
* <li>Logging events are automatically <em>buffered</em> by the
|
|
* native TCP implementation. This means that if the link to server
|
|
* is slow but still faster than the rate of (log) event production
|
|
* by the client, the client will not be affected by the slow
|
|
* network connection. However, if the network connection is slower
|
|
* then the rate of event production, then the client can only
|
|
* progress at the network rate. In particular, if the network link
|
|
* to the the server is down, the client will be blocked.
|
|
*
|
|
* <li>On the other hand, if the network link is up, but the server
|
|
* is down, the client will not be blocked when making log requests
|
|
* but the log events will be lost due to server unavailability.
|
|
* </ul>
|
|
*
|
|
* <h3>Properties</h3>
|
|
* <dl>
|
|
* <dt><tt>host</tt></dt>
|
|
* <dd>Remote host name to connect and send events to.</dd>
|
|
*
|
|
* <dt><tt>port</tt></dt>
|
|
* <dd>Port on remote host to send events to.</dd>
|
|
*
|
|
* <dt><tt>ServerName</tt></dt>
|
|
* <dd>Host name of event's origin prepended to each event.</dd>
|
|
*
|
|
* </dl>
|
|
*/
|
|
class LOG4CPLUS_EXPORT SocketAppender : public Appender {
|
|
public:
|
|
// Ctors
|
|
SocketAppender(const log4cplus::tstring& host, unsigned short port,
|
|
const log4cplus::tstring& serverName = tstring());
|
|
SocketAppender(const log4cplus::helpers::Properties & properties);
|
|
|
|
// Dtor
|
|
~SocketAppender();
|
|
|
|
// Methods
|
|
virtual void close();
|
|
|
|
protected:
|
|
void openSocket();
|
|
void initConnector ();
|
|
virtual void append(const spi::InternalLoggingEvent& event);
|
|
|
|
// Data
|
|
log4cplus::helpers::Socket socket;
|
|
log4cplus::tstring host;
|
|
unsigned int port;
|
|
log4cplus::tstring serverName;
|
|
|
|
#if ! defined (LOG4CPLUS_SINGLE_THREADED)
|
|
class LOG4CPLUS_EXPORT ConnectorThread;
|
|
friend class ConnectorThread;
|
|
|
|
class LOG4CPLUS_EXPORT ConnectorThread
|
|
: public thread::AbstractThread
|
|
{
|
|
public:
|
|
ConnectorThread (SocketAppender &);
|
|
virtual ~ConnectorThread ();
|
|
|
|
virtual void run();
|
|
|
|
void terminate ();
|
|
void trigger ();
|
|
|
|
protected:
|
|
SocketAppender & sa;
|
|
thread::ManualResetEvent trigger_ev;
|
|
bool exit_flag;
|
|
};
|
|
|
|
volatile bool connected;
|
|
helpers::SharedObjectPtr<ConnectorThread> connector;
|
|
#endif
|
|
|
|
private:
|
|
// Disallow copying of instances of this class
|
|
SocketAppender(const SocketAppender&);
|
|
SocketAppender& operator=(const SocketAppender&);
|
|
};
|
|
|
|
namespace helpers {
|
|
LOG4CPLUS_EXPORT
|
|
void convertToBuffer (SocketBuffer & buffer,
|
|
const log4cplus::spi::InternalLoggingEvent& event,
|
|
const log4cplus::tstring& serverName);
|
|
|
|
LOG4CPLUS_EXPORT
|
|
log4cplus::spi::InternalLoggingEvent readFromBuffer(SocketBuffer& buffer);
|
|
} // end namespace helpers
|
|
|
|
} // end namespace log4cplus
|
|
|
|
#endif // LOG4CPLUS_SOCKET_APPENDER_HEADER_
|
|
|