1

I have a single file which sends SMS to different mobile networks according to command line arguements passed to it. Vodafone, 3 network, T-Mobile,O2.. etc. So, when arguement is passed

$Run SMSDaemon 3Network  // sends sms to 3 networks's mobile users
$Run SMSDaemon Vodafone  // sends sms to Vodafone  mobile users
$Run SMSDaemon TMobile  // sends sms to TMobile  mobile users
$Run SMSDaemon O2    // sends sms to O2 mobile users

Now, I want to create a separate log files for separate network such that I can have log info,debug message separately according to mobile networks.

Since, I have only a single file SMSDaemon I have tried the following but it's not writing anything to file. It's only writing to a file which have been defined in log4j.properties file. So, I am confused what to write in log4j.properties and what to write in this java file??

public static void main(String[] args) {
if( args.length != 1  {  return;}
networkUnique = args[0];
setLogProps(networkUnique);
//other codes and in setLogProps method 

private static void setLogProps(String networkUnique)
{
log = Logger.getLogger(networkUnique);
Properties logprops=new Properties();
logprops.setProperty("log4j.appender.file","org.apache.log4j.FileAppender");
logprops.setProperty("log4j.appender.file.maxFileSize","300MB");
logprops.setProperty("log4j.appender.file.maxBackupIndex","100");
logprops.setProperty("log4j.appender.file.File","/etc/sms/"+networkUnique+".log");
logprops.setProperty("log4j.appender.file.threshold","debug");
logprops.setProperty("log4j.appender.file.layout","org.apache.log4j.PatternLayout");
logprops.setProperty("log4j.appender.file.layout.ConversionPattern","%d [%t] %-5p  [%-35F : %-25M : %-6L] %-C -%m%n"); 
logprops.setProperty("log4j.appender.stdout","org.apache.log4j.FileAppender"); 
PropertyConfigurator.configure(logprops); 
log.info("Log message Starting for "+ networkUnique);
}

In log4j.properties file following is written. All the logs are written to network.log file which is defined in this properties.. which is not according to my requirement. I need separate log for separate network which is defined in SMSDaemon setLogProps method.

# Define the root logger with appender file
#log = /etc/sms/
log4j.rootLogger = info, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
#log4j.appender.FILE.File=${log}/network.log

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Please suggest.

Thanks in advance.

Madan Madan
  • 674
  • 1
  • 11
  • 28

2 Answers2

1

You need to create different appenders to achieve the goal. Try this configurations :

<appender name="3Network" class="org.apache.log4j.FileAppender">
    <param name="file" value="logs/3Network.log" />
    <param name="append" value="true" />        
</appender> 
<appender name="Vodafone" class="org.apache.log4j.FileAppender">
    <param name="file" value="logs/Vodafone.log" />
    <param name="append" value="true" />        
</appender> 
<appender name="TMobile" class="org.apache.log4j.FileAppender">
    <param name="file" value="logs/TMobile.log" />
    <param name="append" value="true" />        
</appender> 

The same you can write as :

log4j.appender.TMobile=org.apache.log4j.FileAppender
log4j.appender.TMobile.File=logs/TMobile.log.. 

and so on..

Hope this will help you to get your issue resolved. Also see this - reference

Community
  • 1
  • 1
Ved
  • 8,577
  • 7
  • 36
  • 69
  • Sorry, it didn't help out! tried with log4j.appender.TMobile , Any other suggestion!! – Madan Madan Oct 07 '12 at 07:03
  • It gave me the error No appenders could be found for logger TMobile... any Idea how it came? – Madan Madan Oct 07 '12 at 07:15
  • The message means that the log4j.properties file was not found. You try for console appender rather, if it works, then try to correct your log4j.xml or log4j.properties. This may help - http://www.coderanch.com/t/63230/open-source/log-log-WARN-No-appenders – Ved Oct 07 '12 at 07:21
  • I have log4j.properties file. When I tried with TMobile and 3 Networks. The information was written to both of the files like the info of 3 networks was written to TMobile.log as well and vice versa. log4j.appender.3network=org.apache.log4j.FileAppender log4j.appender.3networks.File=${log}/3network.log log4j.appender.3networks.layout=org.apache.log4j.PatternLayout log4j.appender.3networks.layout.ConversionPattern=%d [%t] %-5p [%-35F : %-25M : %-6L] %-C -%m%n Same for other networks. But now the log is written to all of them. – Madan Madan Oct 07 '12 at 07:31
  • then your logging class logic needs to be updated, so that each separate log will be dumped in separate file. – Ved Oct 07 '12 at 07:35
  • I have the following in SMSDaemon private static Logger log = Logger.getLogger(networkUnique); NetworkUnique is the uniqueID for 3 network, TMobile,O2, etc.. – Madan Madan Oct 07 '12 at 13:25
1

I would advice to create different Logger classes based on your network e.g.

     class com.netwrok.Network1Logger{
          public void logMessage(String className, String message, String Level);
     }

     class com.netwrok.Network2Logger{
          public void logMessage(String className, String message, String Level);
     }

Then update log4j.properties as below:

    # Root logger option
    log4j.rootLogger=INFO, RootFileAppender

    #Network1 Logger option
    log4j.logger.com.netwrok.Network1Logger=INFO,Network1FileAppender

    #Network2 Logger option
    log4j.logger.com.netwrok.Network2Logger=INFO,Network2FileAppender


    # RootFileAppender - used to log messages in the root.log file.
    log4j.appender.RootFileAppender=org.apache.log4j.FileAppender
    log4j.appender.RootFileAppender.File=root.log
    log4j.appender.RootFileAppender.MaxFileSize=100MB
    log4j.appender.RootFileAppender.layout=org.apache.log4j.PatternLayout
    log4j.appender.RootFileAppender.layout.ConversionPattern= %5p [%t] (%F:%L) - %m%n


    # Network1FileAppender- used to log messages in the shunted.log file.
    log4j.appender.Network1FileAppender=org.apache.log4j.FileAppender
    log4j.appender.Network1FileAppender.File=shunted.log
    log4j.appender.Network1FileAppender.MaxFileSize=10MB
    log4j.appender.Network1FileAppender.layout=org.apache.log4j.PatternLayout
    log4j.appender.Network1FileAppender.layout.ConversionPattern= %5p [%t] (%F:%L) - %m%n

    # Network2FileAppender- used to log messages in the shunted.log file.
    log4j.appender.Network2FileAppender=org.apache.log4j.FileAppender
    log4j.appender.Network2FileAppender.File=shunted.log
    log4j.appender.Network2FileAppender.MaxFileSize=10MB
    log4j.appender.Network2FileAppender.layout=org.apache.log4j.PatternLayout
    log4j.appender.Network2FileAppender.layout.ConversionPattern= %5p [%t] (%F:%L) - %m%n

If you don't desire, root logger, shut it off.

Yogendra Singh
  • 33,927
  • 6
  • 63
  • 73
  • There are many networks and there might be the condition of introduction of new networks so I think this won't help as I have to create everytime new class. Any other idea? – Madan Madan Oct 07 '12 at 07:05