5 Ocak 2009 Pazartesi

Oracle İAS plain text logger

Oracle İAS, her oc4j instance'sı için düz metin olarak tuttuğu log dosyasını xml formatında sakladığı log dosyaları gibi yönetmemektedir. XML loglar belirli bir büyüklüğe geldiği zaman backuplanır ve güncel loglar yeni bir dosyaya yazılır. Backup sayısıda belirli bir seviyeye ulaştığında en eskli log dosyası silinir. Bu log dosyası max büyüklüğü ile log dosyası sayısı ayarlanabilir. Bu ayarlar nasıl yapılacağı ile ilgili ayrıntılara http://download.oracle.com/docs/cd/B31017_01/web.1013/b28950/logadmin.htm adresinden erişebilirsiniz.

Managing Text Log Files
It is important to monitor your log files, as text logging does not have any imposed size limits or log rotation capability. If left unchecked, log files will continue to grow and can overrun the disk.

The only way to manage these files is to stop OC4J, remove the files, and then restart OC4J to start the log files over.

Sürekli büyüyen plain text log dosyaları bir yerden sonra artık okunamamaktadır. Bundan dolayı plain text loglarında xml log dosyaları gibi yönetilebilmesi için bir uygulama geliştirdim. Bu uygulama her gece belirli bir saatte ihtiyaç duyulan oc4j instance'larını durdurur, var olan log dosyasının adını 'dosya-adı+bir gün öncenin tarihi' formatında değiştirir ve tekrardan oc4j instance'nı başlatır. Oc4j instance başlarken plain text log dosyasını göremediği için yeni bir tane oluşturur. Uygulama bu sürümünde plain text log dosyasını günlük olarak backuplar, dosya size'na bakmaz. Ayrıca n(bu değer parametre olarak geçilebilir) günden eski log dosyalarınıda siler, böylece log dosyaları yüzünden disk'in şişmesi engellenir.
Şu an bizim ihtiyacımız bu yönde olduğu için PlainTextLogger anlattığım şekilde çalışmaktadır.

PlainTextFileLoggerTask bir ant task'ı olarak çalışmaktadır.

<plainTextFileLogManager fileName='log dosyasının adı' filePath='log dosyasının yeri' fileExtension='log dosyasının uzantısı' maxLogFile='saklanacak dosya sayısı' />

PlainTextFileLoggerTask.java

package dev.log.plaintext;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.apache.tools.ant.Task;

public class PlainTextFileLoggerTask extends Task {

  private String fileName;
  private String filePath;
  private String fileExtension;
  private String maxLogFile;

  public PlainTextFileLoggerTask() {
    if (maxLogFile == null || maxLogFile.equals("1"))
      maxLogFile = "3";
  }
  
  public void execute() {
    try {
      File logFile = new File(filePath + "/" + fileName + "." + fileExtension);
      //kurulumdan onceki gunun tarihinin alinmasi icin-getDate(-1)
      new File(filePath + "/" + fileName + "_" + getDate(-1"." + fileExtension).delete();
      logFile.renameTo(new File(filePath + "/" + fileName + "_" + getDate(-1"." + fileExtension));
      logFile.delete();
      sil();
    catch (Exception e) {
      System.out.println("Bir hata aldım sanki = " + e);
    }
  }
  
  
  /**
   * eski log dosyalarinin en guncel olanlardan maxLogFile kadarini birakir gerisini siler.
   */
  private void sil(){
    List unDeleteds = getUnDeleteds();
    File dir = new File(filePath);    
    String[] children = dir.list();
    for (int i = 0; i < children.length; i++) {
      String name = children[i];
      if(name.startsWith(fileName)&&unDeleteds.indexOf(name)==-1){
         new File(filePath+"/"+name).delete();
      }
    }
  }
  
  private List getUnDeleteds() {
    List unDeleteds = new ArrayList();
    for (int i = -(Integer.parseInt(maxLogFile)); i < 0; i++) {
      unDeleteds.add(fileName+"_"+getDate(i)+"."+fileExtension);      
    }
    return unDeleteds;
  }

  private String getDate(int kacgunoncesi) {
    Calendar clndr = Calendar.getInstance();
    clndr.add(Calendar.DAY_OF_YEAR, kacgunoncesi);
    String yil = clndr.get(Calendar.YEAR"";
    String ay = clndr.get(Calendar.MONTH"";
    String gun = clndr.get(Calendar.DAY_OF_MONTH"";
    if (ay.length() == 1)
      ay = "0" + ay;
    if (gun.length() == 1)
      gun = "0" + gun;
    return yil + ay + gun;
  }

  public void setFileName(String fileName) {
    this.fileName = fileName;
  }

  public String getFileName() {
    return fileName;
  }

  public void setFilePath(String filePath) {
    this.filePath = filePath;
  }

  public String getFilePath() {
    return filePath;
  }

  public void setFileExtension(String fileExtension) {
    this.fileExtension = fileExtension;
  }

  public String getFileExtension() {
    return fileExtension;
  }

  public void setMaxLogFile(String maxLogFile) {
    this.maxLogFile = maxLogFile;
  }

  public String getMaxLogFile() {
    return maxLogFile;
  }

Hiç yorum yok: