繁体   English   中英

java.util.logging.Logger 和 log4j

[英]java.util.logging.Logger and log4j

我正在尝试从这里编译代码: http://www.brackeen.com/javagamebook/#download (第 6 章)并且遇到了麻烦。 我不明白java.util.logging.Logger和 log4j 如何一起工作,但这似乎是问题所在。 我得到的错误都在log.error()log.warn()方法调用上。

这是来自 NetBeans 的 output:

init:
deps-clean:
Deleting directory C:\JB\NetBeansProjects\WRServer\build
Deleting directory C:\JB\NetBeansProjects\WRServer\dist
clean:
init:
deps-jar:
Created dir: C:\JB\NetBeansProjects\WRServer\build\classes
Compiling 23 source files to C:\JB\NetBeansProjects\WRServer\build\classes
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:110: cannot find symbol
symbol  : method error(java.lang.String,java.lang.Exception)
location: class java.util.logging.Logger
            log.error("error initializing ServerSocket", e);
               ^
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:152: cannot find symbol
symbol  : method warn(java.lang.String)
location: class java.util.logging.Logger
                log.warn("error during serverSocket select(): " + ioe.getMessage());
                   ^
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:155: cannot find symbol
symbol  : method error(java.lang.String,java.lang.Exception)
location: class java.util.logging.Logger
                log.error("exception in run()", e);
                   ^
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:187: cannot find symbol
symbol  : method error(java.lang.String)
location: class java.util.logging.Logger
            log.error("no gamecontroller for gameNameHash: " + gameNameHash);
               ^
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:203: cannot find symbol
symbol  : method error(java.lang.String)
location: class java.util.logging.Logger
            log.error("error getting GameController directory");
               ^
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:223: cannot find symbol
symbol  : method warn(java.lang.String)
location: class java.util.logging.Logger
                    log.warn("class file does not extend GameController: " + file);
                       ^
C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:238: cannot find symbol
symbol  : method error(java.lang.String,java.lang.Exception)
location: class java.util.logging.Logger
                log.error("Error instantiating GameController from file: " + file, e);
                   ^
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
7 errors
BUILD FAILED (total time: 0 seconds)

这是直接来自书中的代码。 我还没有尝试编辑它。

package com.hypefiend.javagamebook.server;

import com.hypefiend.javagamebook.common.*;
import com.hypefiend.javagamebook.server.controller.*;

import java.nio.channels.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.util.logging.Logger;
import org.apache.log4j.*;

/**
 * GameServer.java
 *
 * The heart of the framework, GameServer accepts
 * incoming client connections and hands them off to 
 * the SelectAndRead class.
 * GameServer also keeps track of the connected players
 * and the GameControllers.
 *
 * @author <a href="mailto:bret@hypefiend.com">bret barker</a>
 * @version 1.0
 */
public class GameServer extends Thread {
/** log4j Logger */
private Logger log = Logger.getLogger("GameServer");

/** ServerSocketChannel for accepting client connections */
private ServerSocketChannel sSockChan;

/** selector for multiplexing ServerSocketChannels */
private Selector selector;

/** GameControllers keyed by GameName */
private Hashtable gameControllers;

/** classname prefix used for dynamically loading GameControllers */
private static final String CONTROLLER_CLASS_PREFIX = 
"com.hypefiend.javagamebook.server.controller.";

/** players keyed by playerId */
private static Hashtable playersByPlayerId;

/** players keyed by sessionId */
private static Hashtable playersBySessionId;

private boolean running;
private SelectAndRead selectAndRead;
private EventWriter eventWriter;

private static long nextSessionId = 0;

/**
 * main. 
 * setup log4j and fireup the GameServer
 */
public static void main(String args[]) {
BasicConfigurator.configure();
GameServer gs = new GameServer();
gs.start();
}

/**
 * constructor, just initialize our hashtables
 */
public GameServer() {
gameControllers = new Hashtable();
playersByPlayerId = new Hashtable();
playersBySessionId = new Hashtable();
}

/**
 * init the GameServer, startup our workers, etc.
 */ 
public void init() {
log.info("GameServer initializing");

loadGameControllers();
initServerSocket();

selectAndRead = new SelectAndRead(this);
selectAndRead.start();

eventWriter = new EventWriter(this, Globals.EVENT_WRITER_WORKERS); 
}

/**
 * GameServer specific initialization, bind to the server port,
 * setup the Selector, etc.
 */
private void initServerSocket() {
try {
    // open a non-blocking server socket channel
    sSockChan = ServerSocketChannel.open();
    sSockChan.configureBlocking(false);

    // bind to localhost on designated port
    InetAddress addr = InetAddress.getLocalHost();
    log.info("binding to address: " + addr.getHostAddress());
    sSockChan.socket().bind(new InetSocketAddress(addr, Globals.PORT));

    // get a selector
    selector = Selector.open();

    // register the channel with the selector to handle accepts
    SelectionKey acceptKey = sSockChan.register(selector, SelectionKey.OP_ACCEPT);
}
catch (Exception e) {
    log.error("error initializing ServerSocket", e);
    System.exit(1);
}
}

/**
 * Here's the meat, loop over the select() call to 
 * accept socket connections and hand them off to SelectAndRead
 */
public void run() {
init();
log.info("******** GameServer running ********");
running = true;
int numReady = 0;

while (running) {
    // note, since we only have one ServerSocket to listen to,
    // we don't need a Selector here, but we set it up for 
    // later additions such as listening on another port 
    // for administrative uses.
    try {
    // blocking select, will return when we get a new connection
    selector.select();

    // fetch the keys
    Set readyKeys = selector.selectedKeys();

    // run through the keys and process
    Iterator i = readyKeys.iterator();
    while (i.hasNext()) {
        SelectionKey key = (SelectionKey) i.next();
        i.remove();

        ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();
        SocketChannel clientChannel = ssChannel.accept();

        // add to the list in SelectAndRead for processing
        selectAndRead.addNewClient(clientChannel);
        log.info("got connection from: " + clientChannel.socket().getInetAddress());
    }       
    }
    catch (IOException ioe) {
    log.warn("error during serverSocket select(): " + ioe.getMessage());
    }
    catch (Exception e) {
    log.error("exception in run()", e);
    }
}
}

/** 
 * shutdown the GameServer
 */
public void shutdown() {
selector.wakeup();
}

/**
 * Return the next available sessionId
 */
public synchronized String nextSessionId() {
return "" + nextSessionId++;
}

/**
 * finds the GameController for a given GameName
 */
public GameController getGameController(String gameName) {
return getGameControllerByHash(gameName.hashCode());
}

/**
 * finds the GameController for a given GameName hash code
 */
public GameController getGameControllerByHash(int gameNameHash) {
GameController gc = (GameController) gameControllers.get("" + gameNameHash);
if (gc == null) 
    log.error("no gamecontroller for gameNameHash: " + gameNameHash);
return gc;
}

/**
 *  Dynamically loads GameControllers
 */
private void loadGameControllers() {
log.info("loading GameControllers");

// grab all class files in the same directory as GameController
String baseClass = "com/hypefiend/javagamebook/server/controller/GameController.class";
File f = new File( this.getClass( ).getClassLoader().getResource(baseClass).getPath());
File[] files = f.getParentFile().listFiles( );

if (files == null) {
    log.error("error getting GameController directory");
    return;
}

for( int i = 0; ( i < files.length); i++) {
    String file = files[i].getName( );
    if (file.indexOf( ".class") == -1)
    continue;
    if (file.equals("GameController.class"))
    continue;

    try {
    // grab the class
    String controllerClassName = CONTROLLER_CLASS_PREFIX + file.substring(0, file.indexOf(".class"));
    log.info("loading class: " + controllerClassName);

    Class cl = Class.forName(controllerClassName);

    // make sure it extends GameController
    if (!GameController.class.isAssignableFrom(cl)) {
        log.warn("class file does not extend GameController: " + file);
        continue;
    }

    // get an instance and initialize
    GameController gc = (GameController) cl.newInstance();
    String gameName = gc.getGameName();
    gc.init(this, getGameConfig(gameName));

    // add to our controllers hash
    gameControllers.put("" + gameName.hashCode(), gc);

    log.info("loaded controller for gameName: " + gameName + ", hash: " + gameName.hashCode());
    } 
    catch (Exception e) {
    log.error("Error instantiating GameController from file: " + file, e);
    }
}
}


/**
 * pass the event on to the EventWriter
 */
public void writeEvent(GameEvent e) {
eventWriter.handleEvent(e);
}

/**
 * returns the GameConfig object for the given gameName
 */
public GameConfig getGameConfig(String gameName) {
// todo: implement getGameConfig()
return null;
}

/**
 * fetches the Player for a given playerId
 */
public static Player getPlayerById( String id) {
return (Player) playersByPlayerId.get(id);
}

/**
 * fetches the Player for a given sessionId
 */
public static Player getPlayerBySessionId(String id) {
return (Player) playersBySessionId.get(id);
}

/** 
 * add a player to our lists
 */
public static void addPlayer(Player p) {
playersByPlayerId.put(p.getPlayerId(), p);
playersBySessionId.put(p.getSessionId(), p);
}

/**
 * remove a player from our lists
 */
public static void removePlayer(Player p) {
playersByPlayerId.remove(p.getPlayerId());
playersBySessionId.remove(p.getPlayerId());
}

}// GameServer

java.util.logging.Logger没有warn()方法(尽管它有一个warning()方法)。

但是, org.apache.log4j.Logger确实有一个名为warn()的方法。

您确定要导入正确的类吗?

在您的 class 中导入 java.util.logging.Logger 似乎会导致问题(编译器尝试针对该问题进行编译,尽管其目的似乎是使用 Z2E025341F0D1BACE9F141876Z9 类)。

尝试从导入中删除 java.util.logging.Logger 并重新编译。

编辑:好吧,我刚刚检查了问题中链接的页面中链接的 ZIP 文件中的原始 GameServer.java。 它不包含 java.util.logging.Logger 的任何导入。 我的猜测是:

  • 您的项目的类路径中没有 log4j
  • 您或您的 IDE 试图以某种方式自动组织导入。 这最终将 java.util.logging.Logger 添加到导入中,因为在项目的类路径中没有找到该名称的其他 class。

因此,首先将 log4j 添加到类路径中,然后从导入中删除 java.util.logging.Logger。

你能格式化你的代码吗? Ti 会更具可读性...

您正在尝试在 java.util.logger.Logger 的实例上调用 error(String, String) 方法。 没有这样的方法。 您应该改用 Logger.log(Level.SEVERE, "mesage"),或使用 log4J Logger 的实例。 检查源文件的导入部分...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM