【输出语句的弊端】
【日志技术具备的特点和优势】
【注意】:因为对Commons Logging 接口不满意,有人就搞了 SLF4J。因为对Log4j的性能不满意,有人就搞了logback,logback是基于slf4j的日志规范实现的框架
目的
实现步骤
导入Logback框架到项目去,在项目下新建文件夹lib,导入Logback的jar包到该文件夹下
将存放jar文件的lib文件夹添加到项目依赖库中
将Logback的核心配置文件logback.xml直接拷贝到 src 目录下(必须是src下)
创建Logback框架提供的Logger日志对象,后续使用其方法记录系统的日志信息
public static final Logger LOGGER = LoggerFactory.getLogger("类名.class");
public class Test {
//创建Logback的日志对象,代表了日志技术
public static final Logger LOGGER = LoggerFactory.getLogger("Test.class");
public static void main(String[] args) {
try {
LOGGER.debug("main方法开始执行");
LOGGER.info("第二行日志,程序开始做除法");
int a = 10;
int b = 0;
LOGGER.trace("a = "+a);
LOGGER.trace("b = "+b);
System.out.println(a / b);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("程序出现异常:"+e);
}
}
}
对Logback日志框架的控制,都是通过核心配置文件logback.xml来实现的
Logback日志输出位置、格式设置
输出到控制台的配置标志
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
输出到系统文件的配置标志
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
public class Movie {
private String name;
private String actor;
private double score;
private Integer time;
private double price;
private Integer vote;
private Date startTime;
@Override
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", actor='" + actor + '\'' +
", score=" + score +
", time=" + time +
", price=" + price +
", vote=" + vote +
", startTime=" + startTime +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Integer getTime() {
return time;
}
public void setTime(Integer time) {
this.time = time;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Integer getVote() {
return vote;
}
public void setVote(Integer vote) {
this.vote = vote;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Movie(String name, String actor, double score, Integer time, double price, Integer vote, Date startTime) {
this.name = name;
this.actor = actor;
this.score = score;
this.time = time;
this.price = price;
this.vote = vote;
this.startTime = startTime;
}
public Movie() {
}
}
public class User {
private String loginName;
private String pwd;
private String name;
private char sex;
private String phone;
private double money;
@Override
public String toString() {
return "User{" +
"loginName='" + loginName + '\'' +
", pwd='" + pwd + '\'' +
", name='" + name + '\'' +
", sex=" + sex +
", phone='" + phone + '\'' +
", money=" + money +
'}';
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public User() {
}
public User(String loginName, String pwd, String name, char sex, String phone, double money) {
this.loginName = loginName;
this.pwd = pwd;
this.name = name;
this.sex = sex;
this.phone = phone;
this.money = money;
}
}
public class Customer extends User{
public Customer() {
}
public Customer(String loginName, String pwd, String name, char sex, String phone, double money) {
super(loginName, pwd, name, sex, phone, money);
}
}
public class Business extends User {
private String storeName;
private String storeAdress;
public Business(String storeName, String storeAdress) {
this.storeName = storeName;
this.storeAdress = storeAdress;
}
public Business(String loginName, String pwd, String name, char sex, String phone, double money, String storeName, String storeAdress) {
super(loginName, pwd, name, sex, phone, money);
this.storeName = storeName;
this.storeAdress = storeAdress;
}
public Business() {
}
@Override
public String toString() {
return "Business{" +
"storeName='" + storeName + '\'' +
", storeAdress='" + storeAdress + '\'' +
'}';
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getStoreAdress() {
return storeAdress;
}
public void setStoreAdress(String storeAdress) {
this.storeAdress = storeAdress;
}
}
public class SystemManager {
//1.存储些用户给
public static final List<User> ALL_USERS = new ArrayList<>();
//2.存储系统全部商家和排片信息
public static final Map<Business,List<Movie>> ALL_MOVIES = new HashMap<>();
public static final Scanner input = new Scanner(System.in);
//日志
public static final Logger LOGGER = LoggerFactory.getLogger("SystemManager.class");
//日期格式
public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//定义当前登录的用户
public static User loginUser;
//3.准备一些数据
static {
Customer c = new Customer("zlyzly","010302","马浩楠",'男',"15836559567",2000);
ALL_USERS.add(c);
Customer c1 = new Customer("cheng","010302","程明辉",'男',"15038915226",200);
ALL_USERS.add(c1);
Business b = new Business("linyan","010220","林燕",'女',"3185175867",0,"万达影城","二七广场");
ALL_USERS.add(b);
List<Movie> movies = new ArrayList<>();
ALL_MOVIES.put(b,movies);
Business b1 = new Business("fanxian","010220","范闲",'男',"1231231231",0,"国际影城","地球");
ALL_USERS.add(b1);
List<Movie> movies1 = new ArrayList<>();
ALL_MOVIES.put(b1,movies1);
}
public static void main(String[] args) {
shouMain();
}
//首页面
public static void shouMain(){
System.out.println("===========电影系统主页===========");
while(true){
System.out.println("请输入您要进行的操作:");
System.out.println("1.登录(商家,用户)\n2.商家入驻\n3.注册");
switch(input.nextLine()){
case "1":
//登录
login();
break;
case "2":
//商家入驻
break;
case "3":
//注册
break;
default:
System.out.println("输入错误,请重新输入\n");
break;
}
}
}
//登录功能
public static void login(){
System.out.println("===========用户登录页面===========");
while(true){
System.out.println("请输入您的登录名称:");
loginUser = getUserByLoginName(input.nextLine());
if(loginUser==null){
System.out.println("用户名称不存在,请重新输入");
continue;
}
System.out.println("请输入您的登录密码:");
if(loginUser.getPwd().equals(input.nextLine())){
System.out.println("登录成功!\n");
if(loginUser instanceof Customer){
CustomerMenu();
}else {
BusinessMenu();
}
break;
}
System.out.println("密码错误,请重新输出!\n");
}
}
//根据用户名称查询该用户对象
public static User getUserByLoginName(String loginName){
for (User user : ALL_USERS) {
if(user.getLoginName().equals(loginName)){
return user;
}
}
return null;
}
//用户操作页面
public static void CustomerMenu(){
Customer c = (Customer) loginUser;
System.out.println("===========电影用户界面===========");
while (true) {
System.out.println(loginUser.getLoginName()+(loginUser.getSex() == '男'? "先生":"女士")+"欢迎您进入系统");
System.out.println("请选择您要操作的功能:");
System.out.println("1、展示全部影片信息功能\n2、根据电影名称查询电影信息\n3、评分功能\n4、购票功能\n5、退出系统");
switch(input.nextLine()){
case "1":
//展示全部影片信息
showALLMovies();
break;
case "2":
//根据电影名查询电影信息
break;
case "3":
//评分
break;
case "4":
//购票
buyVote();
break;
case "5":
//退出
return;
default:
System.out.println("输入错误,请重新输入!\n");
break;
}
}
}
//商家操作页面
public static void BusinessMenu(){
while(true){
System.out.println("===========电影商家界面===========");
String call = loginUser.getSex()=='男' ? "男士":"女士";
System.out.println(loginUser.getLoginName()+call+"您好,请选择商家操作的功能");
System.out.println("1、展示详情\n2、上架电影\n3、下架电影\n4、修改电影\n5、退出");
System.out.println("请输入您要操作的命令:");
switch(input.nextLine()){
case "1":
//展示详情
showMovies();
break;
case "2":
//上架电影
try {
putawayMovie();
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("日期输入错误");
}
break;
case "3":
//下架电影
riseMovie();
break;
case "4":
//修改电影
try {
updateMovie();
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("日期输入有误!");
}
break;
case "5":
//退出
return;
default:
System.out.println("输入错误,请重新输入!\n");
break;
}
}
}
//显示该店铺下所有电影
public static void showMovies(){
System.out.println("===========电影商家详情===========");
Business b = (Business) loginUser;
System.out.println("您当前个人信息如下:");
System.out.println(b.getStoreName()+" 电话:"+b.getPhone()+" 地址:"+b.getStoreAdress()+"\t总营收:"+b.getMoney());
System.out.println("您的影院排片信息如下:");
if(ALL_MOVIES.get(b).size() < 1){
System.out.println("您当前无任何排片信息~\n");
return;
}
System.out.println("\t影片名称\t\t\t主演\t\t\t时长\t\t票价\t\t余票\t\t放映时间");
for (Movie movie : ALL_MOVIES.get(b)) {
System.out.println("\t"+movie.getName()+"\t\t"+movie.getActor()+"\t\t"+movie.getTime()+"\t\t"+movie.getPrice()+"\t"+movie.getVote()+"\t\t"+SDF.format(movie.getStartTime()));
}
}
//上架功能
public static void putawayMovie() throws Exception {
Business b = (Business) loginUser;
System.out.println("===========电影上架影片===========");
Movie movie = new Movie();
System.out.println("请输入新片名:");
movie.setName(input.nextLine());
System.out.println("请输入主演");
movie.setActor(input.nextLine());
System.out.println("请输入时长");
movie.setTime(Integer.valueOf(input.nextLine()));
System.out.println("请输入票价");
movie.setPrice(Double.valueOf(input.nextLine()));
System.out.println("请输入票数");
movie.setVote(Integer.valueOf(input.nextLine()));
System.out.println("请输入影片放映时间");
String time = input.nextLine();
movie.setStartTime(SDF.parse(time));
ALL_MOVIES.get(b).add(movie);
System.out.println("您已经成功上架了电影:"+movie.getName());
}
//下架功能
private static void riseMovie() {
Business b = (Business) loginUser;
System.out.println("===========电影下架影片===========");
if(ALL_MOVIES.get(b).size() == 0 || ALL_MOVIES.get(b) == null){
System.out.println("还未发布影片,无法下架~");
return;
}
while(true){
System.out.println("请输入电影名称:");
Movie movie = getMovieByName(input.nextLine());
if(movie==null){
System.out.println("该店铺下并没有这部影片,请重新输入:");
continue;
}
System.out.println(ALL_MOVIES.get(b).remove(movie)? "删除成功!\n":"删除失败!\n");
break;
}
}
//根据电影名字获取电影
public static Movie getMovieByName(String movieName){
Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
for (Map.Entry<Business, List<Movie>> entry : entries) {
for (Movie movie : entry.getValue()) {
if(movie.getName().equals(movieName)){
return movie;
}
}
}
return null;
}
//修改电影功能
public static void updateMovie() throws Exception{
System.out.println("===========电影商家修改界面===========");
Movie movie = null;
Business b = (Business) loginUser;
System.out.println("===========电影下架影片===========");
if(ALL_MOVIES.get(b).size() == 0 || ALL_MOVIES.get(b) == null){
System.out.println("还未发布影片,无法下架~");
return;
}
while(true){
System.out.println("请输入要修改的电影名称:");
movie = getMovieByName(input.nextLine());
if(movie==null){
System.out.println("该店铺下并没有这部电影,请重新输入");
continue;
}
break;
}
while(true){
System.out.println("请输入要修改的信息:");
System.out.println("1.影片名称\n2.主演\n3.时长\n4.票价\n5.余票\n6.放映时间\n7.退出");
switch(input.nextLine()){
case "1":
System.out.println("请输入修改的电影名称:");
movie.setName(input.nextLine());
break;
case "2":
System.out.println("请输入修改的主演:");
movie.setActor(input.nextLine());
break;
case "3":
System.out.println("请输入修改的时长:");
movie.setTime(Integer.valueOf(input.nextLine()));
break;
case "4":
System.out.println("请输入修改的票价:");
movie.setPrice(Double.valueOf(input.nextLine()));
break;
case "5":
System.out.println("请输入修改的余票:");
movie.setVote(Integer.valueOf(input.nextLine()));
break;
case "6":
System.out.println("请输入修改的放映时间:");
String strTime = input.nextLine();
movie.setStartTime(SDF.parse(strTime));
break;
case "7":
return;
}
}
}
//展示所有电影功能
public static void showALLMovies(){
System.out.println("===========电影影片详情===========");
Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
for (Map.Entry<Business, List<Movie>> entry : entries) {
System.out.println(entry.getKey().getStoreName()+" 电话:"+entry.getKey().getPhone()+" 地址:"+entry.getKey().getStoreAdress());
System.out.println("\t影片名称\t\t\t主演\t\t\t时长\t\t票价\t\t余票\t\t放映时间");
if(entry.getValue()!=null && entry.getValue().size() >= 1){
for (Movie movie : entry.getValue()) {
System.out.println("\t"+movie.getName()+"\t\t"+movie.getActor()+"\t\t"+movie.getTime()+"\t\t"+movie.getPrice()+"\t"+movie.getVote()+"\t\t"+SDF.format(movie.getStartTime()));
}
}
}
}
//购票功能
public static void buyVote(){
showALLMovies();
Customer c = (Customer) loginUser;
while(true){
System.out.println("请输入要购买的门店:");
String name = input.nextLine();
List<Movie> movies = getMoviesByName(name);
Movie movie = null;
if(movies==null){
System.out.println("没有该门店,请重新操作");
continue;
}
System.out.println("请输入您要购买电影的片名:");
for (Movie movie1 : movies) {
if (movie1.getName().equals(input.nextLine())) {
movie = movie1;
break;
}
}
if(movie==null){
System.out.println("该电影并未上映,请重新操作");
return;
}
System.out.println("请输入您要购买几张:");
Integer countVote = Integer.valueOf(input.nextLine());
double money = movie.getPrice() * countVote;
System.out.println("用户金额:"+c.getMoney()+"支付金额:"+money);
if(c.getMoney()<money){
System.out.println("金额不足,请充值!");
continue;
}
if(movie.getVote() < countVote){
System.out.println("余票不足,请重新操作!");
continue;
}
System.out.println("订票成功!您订购了电影"+movie.getName()+"("+countVote+"张)");
c.setMoney(money);
movie.setVote(movie.getVote()-countVote);
Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
for (Map.Entry<Business, List<Movie>> entry : entries) {
if (entry.getValue().contains(movie)) {
entry.getKey().setMoney(entry.getKey().getMoney()+money);
return;
}
}
}
}
//根据名称得到该门店的电影集合
public static List<Movie> getMoviesByName(String name){
Set<Map.Entry<Business, List<Movie>>> entries = ALL_MOVIES.entrySet();
for (Map.Entry<Business, List<Movie>> entry : entries) {
if(entry.getKey().getStoreName().equals(name)){
return entry.getValue();
}
}
return null;
}
}