Avatar billede trp79 Nybegynder
25. juli 2005 - 20:32 Der er 15 kommentarer og
1 løsning

Problemer med log4j - syntes ikke jeg får noget output

Hejsa
Efter at have fulgt Arnes artikkel omkring loggin frameworks, har jeg forsøgt mig med log4j.
log4j.xml har jeg efter Arnes anvisning anbragt i WEB-INF/classes
Understående javafil benyttes via en jsp side, men jeg syntes ikke der sker noget når jeg fx laver et login. Det skal lige understreges at jeg blot afvikler applikationen via JDEVs indbyggede OC4J server, men det burde vel ikke gøre nogen forskel.
Filen log4.log oprettes heller ikke på min mac.

Håber nogen kan hjælpe mig videre.
Følgende output kommer i JDEVs konsol:
Target URL -- http://10.0.1.201:8988/Banankasse-context-root/log_ind.jsp
05/07/25 20:15:59 log4j: Threshold ="null".
05/07/25 20:15:59 log4j: Retreiving an instance of org.apache.log4j.Logger.
05/07/25 20:15:59 log4j: Setting [DatabaseLogger] additivity to [true].
05/07/25 20:15:59 log4j: Level value for DatabaseLogger is  [error].
05/07/25 20:15:59 log4j: DatabaseLogger level set to ERROR
05/07/25 20:15:59 log4j: Class name: [org.apache.log4j.ConsoleAppender]
05/07/25 20:15:59 log4j: Setting property [threshold] to [INFO].
05/07/25 20:15:59 log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
05/07/25 20:16:00 log4j: Setting property [conversionPattern] to [%-30c %d %-5p %m%n].
05/07/25 20:16:00 log4j: Adding appender named [console] to category [DatabaseLogger].
05/07/25 20:16:00 log4j: Class name: [org.apache.log4j.FileAppender]
05/07/25 20:16:00 log4j: Setting property [threshold] to [ERROR].
05/07/25 20:16:00 log4j: Setting property [file] to [log4j.log].
05/07/25 20:16:00 log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
05/07/25 20:16:00 log4j: Setting property [conversionPattern] to [%-30c %d %-5p %m%n].
05/07/25 20:16:00 log4j: setFile called: log4j.log, true
05/07/25 20:16:00 log4j: setFile ended
05/07/25 20:16:00 log4j: Adding appender named [logfile] to category [DatabaseLogger].

*********Database.java**************
package ausumnet;

import java.sql.*;
import javax.servlet.*;
import org.apache.log4j.*;

public class Database
{
    private final static Logger dbLogger = Logger.getLogger("DatabaseLogger");
    private ServletContext application = null;
    private Connection conn=null;    //our connnection to the db - presist for life of program
    private PreparedStatement pstmLoginOk;
    private PreparedStatement pstmOpretBruger;
    private PreparedStatement pstmRegLogin;
    private PreparedStatement pstmRegLogin2;
    private PreparedStatement pstmRegLogin3;
    private ResultSet rsLoginOk;
    private ResultSet rsRegLogin;
   
  public Database(ServletContext application) throws Exception    // note more general exception
  {
    this.application = application;
  }

  public boolean open()
  {
    if(conn!=null) return true;
    else
    {
      try
        {
          String drv=null, url=null, bru=null, adg=null;
          if(application!=null){
            drv = application.getInitParameter("dbDriver");
            dbLogger.info("Database.open() - dbDriver indlæst fra web.xlm");
            url = application.getInitParameter("dbUrl");
            dbLogger.info("Database.open() - dbUrl indlæst fra web.xlm");
            bru = application.getInitParameter("dbBruger");
            dbLogger.info("Database.open() - dbBruger indlæst fra web.xlm");
            adg = application.getInitParameter("dbAdgangskode");
            dbLogger.info("Database.open() - dbAdgangskode indlæst fra web.xlm");
          }
          if(drv==null)
          {
            drv = "com.mysql.jdbc.Driver";
            dbLogger.info("Database.open() - dbDriver indlæst fra metoden");
          }
          if(url==null)
          {
            url = "jdbc:mysql:///Banankasse";
            dbLogger.info("Database.open() - dbUrl indlæst fra metoden");
          }
          if(bru==null)
          {
            bru = "root";
            dbLogger.info("Database.open() - dbBruger indlæst fra metoden");
          }
          if(adg==null)
          {
            adg = "";
            dbLogger.info("Database.open() - dbAdgangskode indlæst fra metoden");
          }
         
          Class.forName(drv);                              //indlæs driver
          dbLogger.info("Database.open() - driver indlæst");
          conn = DriverManager.getConnection(url, bru, adg); //opret forbindelse
          dbLogger.info("Database.open() - forbindelse til db oprettet( conn = DriverManager.getConnection(url, bru, adg); )");
         
          pstmLoginOk = conn.prepareStatement("SELECT brugernavn FROM BKBruger WHERE brugernavn=? AND password=?");
          pstmOpretBruger = conn.prepareStatement("INSERT INTO BKBruger(brugernavn,password,fornavn,efternavn,email,foedselsdato,mobil,fastnet,mailBanan,mailForum,regDato,sidsteLogin,billede, antalLogin) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
          pstmRegLogin = conn.prepareStatement("UPDATE BKBruger SET sidsteLogin= ? WHERE brugernavn = ?");
          pstmRegLogin2 = conn.prepareStatement("SELECT antalLogin FROM BKBruger WHERE brugernavn = ?");
          pstmRegLogin3 = conn.prepareStatement("UPDATE BKBruger SET antalLogin = ? WHERE brugernavn = ?");
          dbLogger.info("Database.open() - prepared statements indlæst");
         
        }
        catch(ClassNotFoundException e){
          dbLogger.error("Database.open() - Problemer med databasen - ClassNotFoundException: "+e);
          System.out.println("Problemer med databasen - ClassNotFoundException: "+e);
          conn = null; //sæt forbindelsen til null og prøv at oprette den senere
          return false;
        }
        catch(SQLException e){
          dbLogger.error("Database.open() - Problemer med databasen - SQLException: "+e);
          System.out.println("Problemer med databasen - SQLException: "+e);
          conn = null; //sæt forbindelsen til null og prøv at oprette den senere
          return false;
        }
        return true;
    }
  }

  public void shutdown() throws SQLException {
      if(conn!=null)
      {
        try
        {
            conn.close();  // if there are no other open connection
                            // db writes out to files and shuts down
                            // this happens anyway at garbage collection
                            // when program ends
            pstmLoginOk.close();
            pstmOpretBruger.close();
            pstmRegLogin.close();
            pstmRegLogin2.close();
            pstmRegLogin3.close();
            conn=null;
            dbLogger.info("Database.shutdown() - forbindelse til database lukket");
        }
        catch (SQLException e)
        {
            dbLogger.error("Database.shutdown() - Problemer med at lukke forbindelse til database: "+e);
            e.printStackTrace(System.out);
        }       
      }
  }

  /**
  * Ud fra det indtastede brugernavn og password logges brugeren ind, hvis der
  * findes en bruger med det pågældende brugernavn og password
  * @return
  * @param password
  * @param brugernavn
  */
  public synchronized boolean loginOk(String brugernavn, String password)
  {
  boolean loggetInd = false;
  try{
        if (open())
        {
          pstmLoginOk.setString(1, brugernavn);
          pstmLoginOk.setString(2, password);
          rsLoginOk = pstmLoginOk.executeQuery();
          if (rsLoginOk.next())
          {
            loggetInd = true;  //korrekt! brugeren er logget ind.
            dbLogger.info("Database.loginOk() - Bruger logget ind: "+brugernavn);
           
          }
          else
          {
            loggetInd = false;
            dbLogger.info("Database.loginOk() - Forkert brugernavn eller password - brugernavn: "+brugernavn);
          }
        rsLoginOk.close();
        pstmLoginOk.clearParameters();;
      }
    }
    catch(SQLException e){
      dbLogger.error("Database.loginOk() - Problemer med at tjekke login: "+e);
      System.out.println("Problemer med tjekLogin - SQLException: "+e);
    }
    return loggetInd;
  }

  /**
  * Ud fra bønnen Login oprettes brugeren i BKBruger.
  * @return
  * @param nytPassword
  * @param login
  */
  public synchronized boolean opretBruger(Login login, String nytPassword)
  {
    if (open())
      try{       
        pstmOpretBruger.setString(1, login.getBrugernavn());
        pstmOpretBruger.setString(2, nytPassword);
        pstmOpretBruger.setString(3, login.getFornavn());
        pstmOpretBruger.setString(4, login.getEfternavn());
        pstmOpretBruger.setString(5, login.getEmail());
        pstmOpretBruger.setDate(6, login.konverterTilDate(login.getFoedselsdato()));
        pstmOpretBruger.setString(7, login.getMobil());
        pstmOpretBruger.setString(8, login.getFastnet());
        pstmOpretBruger.setInt(9, (login.getMailBanan() ? 1 : 0));
        pstmOpretBruger.setInt(10, (login.getMailForum() ? 1 : 0));
        pstmOpretBruger.setTimestamp(11, new Timestamp(new java.util.Date().getTime()));
        pstmOpretBruger.setDate(12, null);
        pstmOpretBruger.setString(13, "billedesti");
        pstmOpretBruger.setInt(14, 0);
        pstmOpretBruger.executeUpdate();
        pstmOpretBruger.clearParameters();
        dbLogger.info("Database.opretBruger() - Bruger oprettet korrekt - brugernavn: "+login.getBrugernavn());
        return true;    //oprettelse lykkedes!
      }
    catch(SQLException e){
        dbLogger.error("Database.opretBruger() - Problemer med opretBruger - SQLException: "+e);
        System.out.println("Problemer med opretBruger - SQLException: "+e);
        return false;
      }
    catch(Exception e){
        dbLogger.error("Database.opretBruger() - Problemer med opretBruger - SQLException: "+e);
        System.out.println("Problemer med opretBruger - Exception: "+e);
        return false;
      }
    else
      return false;
  } 

  /**
  * I BKBruger opdateres felterne sidsteLogin og antalLogin
  * sidsteLogin sættes ud fra tidspunktet på det aktuelle login
  * antalLogin tælles een op.
  * @param brugernavn
  */
  public synchronized void regLogin(String brugernavn)
  {
  try{
        if (open())
        {
          pstmRegLogin.setTimestamp(1, new Timestamp(new java.util.Date().getTime()));
          pstmRegLogin.setString(2,brugernavn);
          pstmRegLogin.executeUpdate();
          pstmRegLogin.clearParameters();
          dbLogger.info("Database.regLogin() - sidsteLogin opdateret");
         
          pstmRegLogin2.setString(1, brugernavn);
          rsRegLogin = pstmRegLogin2.executeQuery();
          if(rsRegLogin.next())
          {
            int antalLogin = rsRegLogin.getInt("antalLogin");
            antalLogin++;
           
            pstmRegLogin3.setInt(1, antalLogin);
            pstmRegLogin3.setString(2, brugernavn);
            pstmRegLogin3.executeUpdate();
            pstmRegLogin3.clearParameters();
            dbLogger.info("Database.regLogin() - antalLogin opdateret");
          }
          rsRegLogin.close();
          pstmRegLogin2.clearParameters();
        }
    }
    catch(SQLException e){
      dbLogger.error("Database.regLogin() - Problemer med regLogin - SQLException: "+e);
      System.out.println("Problemer med regLogin - SQLException: "+e);
    }
  }
}

**************SLUT Database.java**************





**************log4j.xml*******************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
    <!--
      console: minimum level=info, special format
    -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="threshold" value="info"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-30c %d %-5p %m%n"/>
        </layout>
    </appender>
    <!--
      logfile: minmum level=debug, fil=log4.log, special format
    -->
    <appender name="logfile" class="org.apache.log4j.FileAppender">
        <param name="threshold" value="error"/>
        <param name="file" value="log4j.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-30c %d %-5p %m%n"/>
        </layout>
    </appender>
    <!--
      Log3 logger: minimum level=debug, two appenders (logfile + console)
    -->
    <logger name="DatabaseLogger">
        <level value="error"/>
        <appender-ref ref="console"/>             
        <appender-ref ref="logfile"/>
    </logger>
</log4j:configuration>

****************SLUT log4j.xml************
Avatar billede arne_v Ekspert
25. juli 2005 - 20:39 #1
prøv lige:

  <logger nam="DatabaseLogger">
        <level value="info"/>
        ...
    </logger>
Avatar billede simonvalter Praktikant
25. juli 2005 - 20:49 #2
måske et permissions problem med at den ikke får lov til at oprette log4.log ? har oc4j en stdout.log som tomcat.. hvis ja så prøv at kigge i den.
Avatar billede trp79 Nybegynder
25. juli 2005 - 21:01 #3
<logger nam="DatabaseLogger">
        <level value="info"/>
        ...
</logger>

Giver godt output :) jvf:

Target URL -- http://10.0.1.201:8988/Banankasse-context-root/log_ind.jsp
05/07/25 20:59:37 Oracle Application Server Containers for J2EE 10g (10.1.2.0.0) initialized
05/07/25 20:59:41 log4j: Threshold ="null".
05/07/25 20:59:41 log4j: Retreiving an instance of org.apache.log4j.Logger.
05/07/25 20:59:41 log4j: Setting [DatabaseLogger] additivity to [true].
05/07/25 20:59:41 log4j: Level value for DatabaseLogger is  [info].
05/07/25 20:59:41 log4j: DatabaseLogger level set to INFO
05/07/25 20:59:41 log4j: Class name: [org.apache.log4j.ConsoleAppender]
05/07/25 20:59:41 log4j: Setting property [threshold] to [INFO].
05/07/25 20:59:41 log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
05/07/25 20:59:41 log4j: Setting property [conversionPattern] to [%-30c %d %-5p %m%n].
05/07/25 20:59:41 log4j: Adding appender named [console] to category [DatabaseLogger].
05/07/25 20:59:41 log4j: Class name: [org.apache.log4j.FileAppender]
05/07/25 20:59:41 log4j: Setting property [threshold] to [ERROR].
05/07/25 20:59:41 log4j: Setting property [file] to [log4j.log].
05/07/25 20:59:41 log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
05/07/25 20:59:41 log4j: Setting property [conversionPattern] to [%-30c %d %-5p %m%n].
05/07/25 20:59:41 log4j: setFile called: log4j.log, true
05/07/25 20:59:41 log4j: setFile ended
05/07/25 20:59:41 log4j: Adding appender named [logfile] to category [DatabaseLogger].
DatabaseLogger                2005-07-25 20:59:41,753 INFO  Database.open() - dbDriver indlæst fra web.xlm
DatabaseLogger                2005-07-25 20:59:41,759 INFO  Database.open() - dbUrl indlæst fra web.xlm
DatabaseLogger                2005-07-25 20:59:41,760 INFO  Database.open() - dbBruger indlæst fra web.xlm
DatabaseLogger                2005-07-25 20:59:41,761 INFO  Database.open() - dbAdgangskode indlæst fra web.xlm
DatabaseLogger                2005-07-25 20:59:41,771 INFO  Database.open() - driver indlæst
DatabaseLogger                2005-07-25 20:59:42,844 INFO  Database.open() - forbindelse til db oprettet( conn = DriverManager.getConnection(url, bru, adg); )
DatabaseLogger                2005-07-25 20:59:42,895 INFO  Database.open() - prepared statements indlæst
Avatar billede trp79 Nybegynder
25. juli 2005 - 21:02 #4
jeg prøver lige at kigge efter om der er en jdev har en log....
Avatar billede arne_v Ekspert
25. juli 2005 - 21:04 #5
så virker console

:-)

forklaring : det er mest restriktive af logger og appender som gælder

så skal du lige forsøge at finde ud af hvor log4j forsøger at skrive den fil
Avatar billede arne_v Ekspert
25. juli 2005 - 21:06 #6
jeg ville nok finde det fristende at lave et log dir og så angive sti til det
i log4 konfigurationen

PS: husk iøvrigt at kigge lidt på udskrivnings formatet - der er mange andre
    muligheder end den jeg brugte i artiklen
Avatar billede trp79 Nybegynder
25. juli 2005 - 21:18 #7
Jøsses det var mig der var en klovn!
Det hjælper jo ikke noget at fremprovokerer fejl her:
        if(url==null)
          {
            url = "jdbc:mysql:///BanankasseFEJL";
            dbLogger.info("Database.open() - dbUrl indlæst fra metoden");

når url ikke er nul - pinligt... det går vist lige hurtigt nok engang imellem! Beklager :(

Men jeg har da lige et spørgsmål så vi kan få lukket spørgsmålet så. Hvordan angiver jeg en sti til min log fil, således at den bliver placeret i min mappe hos min udbyder?
Avatar billede arne_v Ekspert
25. juli 2005 - 21:22 #8
lav et dir på serveren

find ud af hvad current dir er i din web app med System.getProperty("user.dir")

put en relativ sti udfra de 2 i din log4 config
Avatar billede arne_v Ekspert
25. juli 2005 - 21:24 #9
husk også at overvej nogle af de mange andre spændende appenders

du kan sætte den til at gemem log i din database (ikke smart hvis du kun har få MB,
men smart hvis du skal søge i loggen)

du kan sætte den til (ved alvorlige fejl) at sende dig en email

etc.etc.
Avatar billede trp79 Nybegynder
25. juli 2005 - 21:30 #10
Det lyder super Arne.
Smid du bare et velfortjent svar.

Jeg troede iøvrigt at dbLogger.info også blev skrevet i en log fil, så det har også været en af årsager til mine bøf. Men der går da heldigvis mere og mere op for en.

Tak for hjælpen.
Avatar billede simonvalter Praktikant
25. juli 2005 - 21:48 #11
Du skal vel også have fjernet de System.out i din kode ellers er pointen væk ved frameworket.

private static Logger logger = Logger.getLogger(Test.class);  mener jeg er lidt smartere at bruge end "et eller andet navn"
Du slipper for at skulle kigge i klassen hvilket navn den der nu har lavet den har brugt (forhåbeligt har man så en navngivnings standard .. men aligevel)  Så hvis du skal slå en logger fra, ændre på level osv så kan du gøre det på klassse navnet. Håber det en dag bliver muligt at give en tom constructor så den defaulter til klassens navn, men indtil da kan man bruge en template i sin ide til at generere.
Avatar billede trp79 Nybegynder
25. juli 2005 - 21:52 #12
Jeps har fjernet de System.out - det var bare indtil jeg fik det til at spille :)
Tak for forslaget om Test.class - det er straks indført!
Smider du et svar også? Så er der også en lille andel til dig...
Avatar billede simonvalter Praktikant
25. juli 2005 - 21:53 #13
nej giv du bare dem til arne, jeg kigger bare med.
Avatar billede arne_v Ekspert
25. juli 2005 - 22:07 #14
Det er absolut en god ide at bruge klassenavn som logger navn.

Pointen er at log4j er hirakisk.

Og hvis man angiver logger navn til klassenavn inkl. package, så kan man
styre logging på package niveau.

Man kan f.eks. sætte dk.trp til ERROR men dk.trp.db til INFO og så vil
dk.trp.util.Noget kun udskrive error mens dk.trp.db.Connection vil
udskrive info
Avatar billede arne_v Ekspert
25. juli 2005 - 22:07 #15
og svar
Avatar billede trp79 Nybegynder
26. juli 2005 - 09:04 #16
Tak for de gode forklaringe - det er en fornøjelse at læse!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester