辰迅云帮助中心

其他类

这篇文章将为大家详细讲解有关Node.JS中怎么实现事件轮询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。网站延迟的开销对于一个网站,后台大多不需要进行复杂的计算,我们的程序大多时间花费在I/O读取上。看到一个数据:IO操作可以比数据处理慢几个数量级。高端SSD固态硬盘的读取速度可以达到200mb-700mb/s;读取1000字节需要1.4微秒。而在此期间,2GHZ频率的CPU可以执行28000个指令处理周期。而网络数据的IO甚至更慢!NodeJS采用单线程非阻塞的架构解决老大难的IO问题当采用多线程时,为每一个请求开启一个新的线程(Apache就是这样做的)。当并发增多,线程的消耗会十分严重。什么是阻塞和非阻塞呢?阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。var fs = require("fs"); fs.readFile("./testfile", "utf8", function(error, file) {    if (error) throw error;    console.log("我读完文件了!"); }); console.log("我不会被阻塞!");用node执行以下代码,会先输出我不会被阻塞,再输出我读完文件了一个知乎的回答:你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。NodeJS的事件轮询这是node虽然为单线程,但是可以处理大并发,高吞吐量的核心。一个事件轮询拥有下面三个组件事件队列:这是一个FIFO模型的队列,一方推入事件,另一方推出事件队列的读取轮询线程组件,也就是主角Event Loop,单独的线程池,用来执行长任务(也就是threadpool,node底层,用C++写的,不会阻塞)在nodejs中,只有一个主线程(也就是前面说的单线程)来不断读取轮询(书中称为调用I/O观察者)队列中是否有事件。而对于读取文件,HTTP请求等(现代cpu处理能力很强,事件处理相当快,导致运行速度下降的瓶颈在I/O)比较容易堵塞的事件,就在这个单线程中执行肯定会造成堵塞,所以Event Loop会把这类型的事件交给底层的线程池执行,并给予线程池一个回调函数,当线程池操作完成这堵塞任务后,便把结果和回调函数一起再放入轮询队列中。关于Node.JS中怎么实现事件轮询就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

node.js中怎么实现前后台交互功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。执行过程为:(1)在浏览器地址栏输入网址,向node服务器发送HTML请求;服务器接到请求后,返回一个HTML文件给客户端;(2)客户端浏览器对HTML进行渲染,遇到<script>标签后,再次向服务器请求,服务器响应一个JavaScript文件给客户端,(3)客户端浏览器对JavaScript文件进行渲染,渲染过程中,如果遇到ajax请求,客户端还会向服务器进行请求,服务器仍然会响应浏览器。(4)最后,浏览器把渲染好的网页呈现在浏览者面前。1、HTML部分:<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>客户管理系统</title></head><body><div class="box"> <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="link">NEW CUSTOMER</a> <h3>  <span class="fir">ID</span>  <span>NAME</span>  <span class="fir">AGE</span>  <span>PHONE</span>  <span>ADDRESS</span>  <span>CONTROL</span> </h3> <ul id="conList">  <li>   <span class="fir">1</span>   <span>钱成</span>   <span class="fir">25</span>   <span>13044086186</span>   <span>Bei Jing</span>   <span class="control">    <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" >修改</a>    <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" >删除</a>   </span>  </li> </ul></div><script charset="utf-8" type="text/javascript" src="js/ajax.js"></script><script charset="utf-8" type="text/javascript" src="js/index.js"></script></body></html>2、ajax部分:~function () {  //->createXHR:创建AJAX对象,兼容所有的浏览器 function createXHR() {   var xhr = null,    flag = false,    ary = [     function () {      return new XMLHttpRequest;     },     function () {      return new ActiveXObject("Microsoft.XMLHTTP");     },     function () {      return new ActiveXObject("Msxml2.XMLHTTP");     },     function () {      return new ActiveXObject("Msxml3.XMLHTTP");     }    ];   for (var i = 0, len = ary.length; i < len; i++) {    var curFn = ary[i];    try {     xhr = curFn();     createXHR = curFn;     flag = true;     break;    } catch (e) {    }   }   if (!flag) {    throw new Error("your browser is not support ajax,please change your browser,try again!");   }   return xhr;  }  //->ajax:实现AJAX请求的公共方法; function ajax(options) {   var _default = {    url: "",    type: "get",    dataType: "json",    async: true,    data: null,    getHead: null,    success: null  };   for (var key in options) {    if (options.hasOwnProperty(key)) {     _default[key] = options[key];    }   }   if (_default.type === "get") {    _default.url.indexOf("?") >= 0 ? _default.url += "&" : _default.url += "?";    _default.url += "_=" + Math.random();   }   //->SEND AJAX  var xhr = createXHR();   xhr.open(_default.type, _default.url, _default.async);   xhr.onreadystatechange = function () {    if (/^2\d{2}$/.test(xhr.status)) {     if (xhr.readyState === 2) {      if (typeof _default.getHead === "function") {       _default.getHead.call(xhr);      }     }     if (xhr.readyState === 4) {      var val = xhr.responseText;      if (_default.dataType === "json") {       val = "JSON" in window ? JSON.parse(val) : eval("(" + val + ")");      }      _default.success && _default.success.call(xhr, val);     }    }   };   xhr.send(_default.data);  }  window.ajax = ajax; }();3、JavaScript部分:var customer = (function () {  var conList = document.getElementById('conList');  function bindEvent() {   conList.onclick = function (ev) {    ev = ev || window.event;    var tar = ev.target || ev.srcElement,     tarTag = tar.tagName.toUpperCase(),     tarInn = tar.innerHTML;    if (tarTag === 'A' && tarInn === '删除') {     //->ALERT、CONFIRM、PROMPT    var cusId = tar.getAttribute('data-id'),      flag = window.confirm('确定要删除编号为 [ ' + cusId + ' ] 的客户吗?');     if (flag) {//->点击的是确定按钮:调取对应的API接口实现删除即可     ajax({       url: '/removeInfo?id=' + cusId,       cache: false,       success: function (result) {        if (result && result.code == 0) {         //->删除成功后在HTML结构中移除对应的LI标签        conList.removeChild(tar.parentNode.parentNode);        }       }      });     }    }   }  }  function bindHTML(data) {   var str = '';   for (var i = 0; i < data.length; i++) {    var cur = data[i];    str += '<li>';    str += '<span class="fir">' + cur.id + '</span>';    str += '<span>' + cur.name + '</span>';    str += '<span class="fir">' + cur.age + '</span>';    str += '<span>' + cur.phone + '</span>';    str += '<span>' + cur.address + '</span>';    str += '<span class="control">';    str += '<a href="add.html?id=' + cur.id + '" rel="external nofollow" >修改</a>';    str += '<a href="javascript:;" rel="external nofollow" data-id="' + cur.id + '">删除</a>';    str += '</span>';    str += '</li>';   }   conList.innerHTML = str;  }  return {   init: function () {    ajax({     url: '/getAllList',     type: 'GET',     dataType: 'JSON',     cache: false,     success: function (result) {      if (result && result.code == 0) {       bindHTML(result.data);       bindEvent();      }     }    });   }  } })(); customer.init();4、node服务器部分:var http = require("http");var url = require("url");var fs = require("fs");var server1 = http.createServer(function (request, response) {  var urlObj = url.parse(request.url, true);  var pathname = urlObj.pathname;  var query = urlObj.query;  var reg = /\.(HTML|CSS|JS|ICO)/i;  if (reg.test(pathname)) {   var suffix = reg.exec(pathname)[1].toUpperCase();   var suffixMIME = suffix === 'HTML' ? 'text/html' : (suffix === 'CSS' ? 'text/css' : 'text/javascript');   try {    var conFile = fs.readFileSync('.' + pathname, 'utf-8');    response.writeHead(200, {'content-type': suffixMIME + ';charset=utf-8;'});    response.end(conFile);    //以conFile结束向客户端的响应,即给客户端返回./index.html的全部代码,供客户端渲染成页面。  } catch (e) {    response.writeHead(404, {'content-type': 'text/plain;charset=utf-8;'});    response.end('request file is not found!');   }   return;  }  //->数据API请求处理:客户端的JS代码中我们通过AJAX向服务器发送的请求,服务器接收到请求并且 // 获取客户端传递的数据,把需要的数据内容准备好,然后在返回给客户端,客户端在AJAX的READY // STATE等于4的时候获取返回的内容(都是按照API的规范文档来处理) var customData = fs.readFileSync('./json/custom.json', 'utf-8');  customData.length === 0 ? customData = '[]' : null;  customData = JSON.parse(customData);  var result = {   code: 1,   msg: '失败',   data: null };  var customId = null;  //1)获取所有的客户信息 if (pathname === '/getAllList') {   if (customData.length > 0) {    result = {     code: 0,     msg: '成功',     data: customData    };   }   response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});   response.end(JSON.stringify(result));   return;  }  //2)获取指定的客户信息 if (pathname === '/getInfo') {   customId = query['id'];   customData.forEach(function (item, index) {    if (item['id'] == customId) {     result = {      code: 0,      msg: '成功',      data: item     };    }   });   response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});   response.end(JSON.stringify(result));   return;  }  //3)增加客户信息 if (pathname === '/addInfo') {   var str = '';   request.on('data', function (chunk) {    str += chunk;   });   request.on('end', function () {    var data = JSON.parse(str);    data['id'] = customData.length === 0 ? 1 : parseFloat(customData[customData.length - 1]['id']) + 1;    customData.push(data);    fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');    result = {     code: 0,     msg: '成功'   };    response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});    response.end(JSON.stringify(result));   });   return;  }  //4)修改客户信息 if (pathname === '/updateInfo') {   str = '';   request.on('data', function (chunk) {    str += chunk;   });   request.on('end', function () {    var data = JSON.parse(str),     flag = false;    for (var i = 0; i < customData.length; i++) {     if (data['id'] == customData[i]['id']) {      customData[i] = data;      flag = true;      break;     }    }    if (flag) {     fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');     result = {      code: 0,      msg: '成功'    };    }    response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});    response.end(JSON.stringify(result));   });   return;  }  //5)删除客户信息 if (pathname === '/removeInfo') {   customId = query['id'];   var flag = false;   customData.forEach(function (item, index) {    if (item['id'] == customId) {     customData.splice(index, 1);     flag = true;    }   });   if (flag) {    fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');    result = {     code: 0,     msg: '成功'   };   }   response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});   response.end(JSON.stringify(result));   return;  }  response.writeHead(404, {'content-type': 'text/plain;charset=utf-8;'});  response.end('request url is not found!'); }); server1.listen(80, function () {  console.log("server is success,listening on 80 port!"); });看完上述内容,你们掌握node.js中怎么实现前后台交互功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注辰讯云资讯频道,感谢各位的阅读!...

node.js中如何使用url模块

2021/7/20 22:41:18

本篇文章为大家展示了node.js中如何使用url模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。引入模块var url = require('url');一、url.parse()/* url.parse(urlString[,parseQueryString[,slashesDenoteHost]])  * urlString <string>将被解析的网址  * parseQueryString <boolean> 默认为false,将query解析成一个字符串;如何设为true,则将query解析成一个对象  * @return <object>  */var result = url.parse('https://www.baidu.com/s?ie=UTF-8&wd=node.js')console.log(result);// 打印结果{  protocol: 'https:', // url协议 slashes: true, // 斜线'/' auth: null, // 用户认证 host: 'www.baidu.com', // 主机 port: null, // 端口 hostname: 'www.baidu.com', // 主机名 hash: null, // hash 值 search: '?ie=UTF-8&wd=node.js', // url中查询信息,包含'?' query: 'ie=UTF-8&wd=node.js', // url中查询信息,不包含'?' pathname: '/s', // 跟在host之后的整个文件路径 path: '/s?ie=UTF-8&wd=node.js', // pathname和search href: 'https://www.baidu.com/s?ie=UTF-8&wd=node.js' // 元素url}二、url.format(urlObject)format方法与parse方法相反,它用于根据某个对象生成urlvar urlObj = {  protocol:'http',  host:'www.baidu.com',  pathname:'/page',  search:'?index=1&sign=true'}var urlStr = url.format(urlObj);console.log(urlStr);// 打印结果// http://www.baidu.com/page?index=1&sign=true三、url.resolve(from,to)用于拼接urlvar urlStr = url.resolve('http://www.baidu.com/','page');console.log(urlStr);// 打印结果// http://www.baidu.com/pagevar urlStr1 = url.resolve('/page/person/','pic');console.log(urlStr1);// 打印结果// /page/person/pic上述内容就是node.js中如何使用url模块,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...

这篇文章主要讲解了“Linux删除目录的命令是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux删除目录的命令是什么”吧!linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中&hellip;&hellip;直接rm就可以了,不过要加两个参数-rf 即:rm -rf   目录名字-r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思需要提醒的是:使用这个rm -rf的时候一定要格外小心,linux没有回收站的当然,rm还有更多的其他参数和用法,输入man rm就可以查看了Related posts:在Linux操作的一些命令Linux系统修改root的密码Linux多个ip增加运行感谢各位的阅读,以上就是“Linux删除目录的命令是什么”的内容了,经过本文的学习后,相信大家对Linux删除目录的命令是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是辰讯云,小编将为大家推送更多相关知识点的文章,欢迎关注!...

MongoDB中怎么查询数据

2021/7/16 23:30:19

MongoDB中怎么查询数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下:db.user.insertMany( [{ name:'jack', age:22, sex:'Man', tags:['python','c++','c'], grades:[22,33,44,55], school:{ name:'shida', city:'xuzhou' } },{ name:'jhon', age:33, sex:null, tags:['python','java'], grades:[66,22,44,88], school:{ name:'kuangda', city:'xuzhou' } }, { name:'xiaoming', age:33, tags:['python','java'], grades:[66,22,44,88], school:{ name:'kuangda', city:'xuzhou' } } ] )find( , )其中 query 表示查找的条件,相当于 mysql 中 where 子句, projection 列出你想要查找的数据,格式为  db.collection.find(find(<query filter>, <projection>))实例:下面不带参数的查找,将会查找出所有的结果 db.find().pretty();          //输出结果           {                                                              "_id" : ObjectId("59056f81299fe049404b2899"),          "name" : "jack",                                       "age" : 22,                                            "tags" : [                                                     "python",                                              "c++",                                                 "c"                                            ],                                                     "grades" : [                                                   22,                                                    33,                                                    44,                                                    55                                             ],                                                     "school" : {                                                   "name" : "shida",                                      "city" : "xuzhou"                              }                                              }下面找出满足 name 为 jack 的数据,并且只输出 name , age ,这里的 _id 是默认输出的,如果不想输出将将它设置为 0  ,想要输出那个字段将它设置为1db.user.find({name:'jack'},{name:1,age:1})  //输出结果 { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22 }   db.user.find({name:'jack'},{name:1,age:1,_id:0})  //输出结果 {"name" : "jack", "age" : 22 }**注意这里的一个 projection 不能 同时 指定包括和排除字段,除了排除 _id 字段。 在 显式包括 字段的映射中, _id  字段是***一个您可以 显式排除 的。查询内嵌文档上述例子中插入的 school 数据就表示内嵌文档完全匹配查询完全匹配查询表示 school 中的查询数组必须和插入的数组完全一样,顺序都必须一样才能查找出来db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}});  //输出结果  { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }   //下面是指定输出的字段,这里的school.name表示只输出school文档中name字段,必须加引号 db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}},{name:1,age:1,'school.name':1}); //输出结果 { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "school" : { "name" : "shida" } }键值对查询可以通过键值对查询,不用考虑顺序,比如 'school.name':'shida' ,表示查询学校名字为shida 的数据,这里的引号是必须要的db.user.find({'school.name':'shida'},{name:1,school:1});  //输出结果  { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "school" : { "name" : "shida", "city" : "xuzhou" } }查询操作符下面我们将配合查询操作符来执行复杂的查询操作,比如元素查询、 逻辑查询 、比较查询操作。我们使用下面的比较操作符 "$gt" 、 "$gte" 、  "$lt" 、 "$lte" (分别对应 ">" 、 ">=" 、 "<" 、 "<=" )实例下面查询年龄在 20-30 之间的信息db.user.find({ age:{$gt:20,$lt:30}   })  //输出 { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }$ne$ne 表示不相等,例如查询年龄不等于 22 岁的信息db.user.find({age:{$ne:22}})  //输出 { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }slice$slice 操作符控制查询返回的数组中元素的个数。此操作符根据参数 { field: value } 指定键名和键值选择出文档集合,并且该文档集合中指定  array 键将返回从指定数量的元素。如果 count 的值大于数组中元素的数量,该查询返回数组中的所有元素的。语法: db.collection.find( { field: value }, { array: {$slice: count }}) ;下面将查询 grades 中的前两个数db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1});  //输出,可以看出这里的grades只输出了前面两个  { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "age" : 22, "grades" : [ 22, 33 ], "school" : { "name" : "shida" } }下面将输出后3个数据db.user.find({name:'jhon'},{grades:{$slice:-3},name:1});  //输出 { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "grades" : [ 22, 44, 88 ] }下面介绍指定一个数组作为参数。数组参数使用 [ skip , limit ]  格式,其中***个值表示在数组中跳过的项目数,第二个值表示返回的项目数。db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1});  //这里将会跳过前面的两个,直接得到后面的两个数据   //输出  { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "grades" : [ 44, 55 ] }$exists如果 $exists 的值为 true ,选择存在该字段的文档,若值为 false 则选择不包含该字段的文档下面将会查询不存在sex这一项的信息db.user.find({sex:{$exists:false}})  //结果 { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }   db.user.find({sex:{$exists:true}});  //结果 { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }$or执行逻辑 OR 运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。语法: { $or: [ { <expression1> }, { <expression2> }, ... , {  <expressionN> } ] }下面将要查找 age 等于 22 或者 age 等于 33 的值db.user.find({$or:[{age:22},{age:33}]})  //结果  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }下面将会查找出年龄为22或者33并且姓名为 jack 的人的信息db.user.find({name:'jack',$or:[{age:33},{age:22}]})  //结果  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }$and指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。 $and 操作符使用短路操作,若***个表达式的值为“ false  ”,余下的表达式将不会执行。语法: { $and: [ { <expression1> }, { <expression2> } , ... , {  <expressionN> } ] }下面将会查找年龄在 20-30 之间的信息,对于下面使用逗号分隔符的表达式列表, MongoDB会提供一个隐式的 $and 操作:db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]}) //上述语句相当于db.user.find({age:{$gt:20},age:{$lt:30}})  //结果 { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }$in匹配键值等于指定数组中任意值的文档。类似 sql 中 in ,只要匹配一个 value 就会输出语法: { field: { $in: [<value1>, <value2>, ... <valueN> ] }  }下面将会查找grades中存在22,33之间的任意一个数的信息 db.user.find({grades:{$in:[22,33]}})    //输出   { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }$nin匹配键不存在或者键值不等于指定数组的任意值的文档。类似 sql 中 not in (SQL中字段不存在使用会有语法错误).查询出 grades 中不存在100或者44的文档db.user.find({grades:{$nin:[100,44]}})$not执行逻辑 NOT 运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。 $not 操作符不能独立使用,必须跟其他操作一起使用语法:{ field: { $not: { } } }查询年龄不大于30的信息db.user.find({age:{$not:{$gt:30}}})  //输出 { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }看完上述内容,你们掌握MongoDB中怎么查询数据的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注辰讯云资讯频道,感谢各位的阅读!...

MongoDB与MySQL哪个好

2021/7/16 23:24:00

本篇文章为大家展示了MongoDB与MySQL哪个好,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是MySQL / MariaDB?MySQL AB的Monty Widenius和David Axmark最初于1994年开始开发MySQL。产品名称中的“  My”是指Widenius的女儿,而不是英语单词“ my”。MySQL旨在与mSQL(又名Mini)兼容。  SQL),并添加了SQL查询层和开放源代码许可(实际上是专有和GPL双重许可)。MySQL的公共发行版于1996年底开始,并且每年或每两年持续发行一次。MySQL是当前最受欢迎的关系数据库。Sun Microsystems于2008年以10亿美元的价格收购了MySQL  AB,Oracle于2010年收购了Sun。在Oracle收购MySQL的广泛关注中,Widenius在收购Oracle之前就将MySQL  5.5合并到了MariaDB中。MariaDB努力维护与Oracle MySQL版本的兼容性。与功能更强大的商业关系数据库(例如Oracle数据库,IBM DB / 2和Microsoft SQL  Server)相比,MySQL最初是一个相当低端的关系数据库,尽管它足以成为动态网站的后备存储。多年来,它增加了您希望从关系数据库获得的大多数功能,包括事务,参照完整性约束,存储过程,游标,全文索引和搜索,地理索引和搜索以及群集。尽管MySQL现在支持“大数据库”功能,例如主从部署,与Memcached一起使用以及水平分片,但它仍通常用于中小型部署。将MySQL扩展到多个从属服务器可以提高读取性能,但是只有主服务器才能接受写请求。AWS提供了两种形式的MySQL即服务,即Amazon RDS和Amazon  Aurora。后者具有更高的性能,可以处理TB级的数据,更新副本的延迟时间更短,并且可以直接与Oracle数据库和SQL Server竞争。什么是MongoDB?MongoDB是高度可伸缩的操作文档数据库,可在开源版本和商业企业版本中使用,它可以在本地运行或作为托管云服务运行。托管云服务称为MongoDB  Atlas。MongoDB无疑是NoSQL数据库中最受欢迎的数据库。它的文档数据模型为开发人员提供了极大的灵活性,而其分布式体系结构则提供了很好的可伸缩性。因此,通常选择MongoDB用于必须管理大量数据,得益于水平可伸缩性并处理不适合关系模型的数据结构的应用程序。MongoDB是一个基于文档的存储,在其之上还具有一个基于图形的存储。MongoDB实际上并不存储JSON:它存储BSON(二进制JSON),该扩展了JSON表示(字符串)以包括其他类型,例如int,long,date,浮点,decimal128和地理空间坐标。MongoDB可以使用数据的类型生成正确的索引类型,从而在数据的单个副本上生成多模式图形,地理空间,B树和全文本索引。MongoDB使您可以在任何文档字段上创建索引。MongoDB  4具有多文档事务,这意味着即使必须标准化数据设计,您仍然可以获得ACID属性。默认情况下,MongoDB使用动态模式,有时称为无模式。单个集合中的文档不需要具有相同的字段集,并且字段的数据类型可以在集合中的不同文档之间有所不同。您可以随时使用动态模式更改文档结构。但是,可以使用架构治理。从MongoDB 3.6开始,MongoDB支持JSON模式验证,您可以在验证器表达式中将其打开。LAMP和MEAN堆栈在LAMP和MEAN堆栈上存在很多变化。例如,您可以在Windows(WAMP)或MacOS(MAMP)上运行而不是Linux  OS。您可以运行IIS(WIMP),而不是Windows上的Apache Web服务器。您可以运行PostgreSQL或SQL  Server,而不是LAMP堆栈中的MySQL关系数据库。如果您需要全球分布,则可以运行CockroachDB或Google Cloud  Spanner。可以使用Perl或Python代替PHP语言。如果要使用Java或C#进行编码,则需要考虑单独的堆栈系列。您可以运行Couchbase或Azure Cosmos  DB以获得更好的全局分布,而不是MEAN堆栈中的MongoDB文档数据库。可以使用十二个Node.js Web服务器框架中的任何一个来代替Express  。除了AngularJS前端框架,您还可以运行Angular 2或React。如何为您的应用程序选择数据库选择数据库时要问的最重要的问题是:您希望在应用程序成熟时存储多少数据?您希望在高峰负载下同时处理多少个用户?您的应用程序需要什么可用性,可伸缩性,延迟,吞吐量和数据一致性?您的数据库架构多久更改一次?您的用户群体的地理分布是什么?您的数据的自然“形状”是什么?您的应用程序需要在线事务处理(OLTP),分析查询(OLAP)还是同时需要两者?您期望生产中的读写比例是多少?您需要地理查询和/或全文查询吗?您首选的编程语言是什么?你有预算吗?如果是这样,它将涵盖许可和支持合同吗?这些问题中的几个会趋于缩小数据库的选择范围,但是与制定LAMP堆栈时相比,我们有更多选择。如果您要构建一个应用程序,并且该应用程序必须在99.999%的时间内对全世界的用户都具有高度的一致性,那么只有少数几个数据库适合您。如果您的应用程序将在工作日的上午9点至下午6点在一个国家/地区使用,并且可以容忍最终的一致性,那么几乎所有数据库都可以使用,尽管某些数据库对于开发人员和操作员而言更容易,而某些数据库则可以为您的主要使用场景提供更好的性能。虽然LAMP和MEAN堆栈一次是Web应用程序的良好解决方案,但现在都不是最佳选择。而不是盲目采用任何一种,您应该仔细考虑用例,并找到一种可在可预见的将来为您的应用程序服务的体系结构。SQL还是NoSQL?您什么时候需要关系数据库(例如MySQL)用于新应用程序?除了对标准SQL的明显支持外,关系数据库本身将数据强制为具有一致的强类型字段的表格模式,并且只要您利用规范化就可以帮助您避免数据重复。如果需要避免丢失数据,则可以NOT  NULL在创建或修改表时声明字段。如果您需要由开放地理空间联盟定义的地理查询,则大多数关系数据库都将提供可靠的实现。而且,如果您需要全文搜索,则大多数关系数据库都允许您在文本字段上定义倒排列表索引,FULLTEXT在MySQL中称为索引。另一方面,如果您还需要偶尔的自由格式文档,则MySQL和许多其他关系数据库也支持RFC  7159定义的JSON数据。如果您还想使用XML文档和XPath或XSLT,则大多数关系数据库都可以提供这种能力。您何时需要像MongoDB这样的文档数据库?如果您的主要用例需要允许使用自由格式的数据,在文档之间更改类型的字段,随时间变化的架构或嵌套的文档,则NoSQL数据库将满足要求。另外,如果您的应用程序是用JavaScript编写的,那么文档数据库的JSON格式将很自然。上述内容就是MongoDB与MySQL哪个好,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...

这篇文章将为大家详细讲解有关MongoDB中怎么恢复误删的数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法一:通过 oplog 恢复如果部署的是 MongoDB 复制集,这时还有一线希望,可以通过 oplog 来尽可能的恢复数据;MongoDB 复制集的每一条修改操作都会记录一条  oplog,所以当数据库被误删后,可以通过重放现有的oplog来「尽可能的恢复数据」。前不久遇到的一个用户,运气非常好,数据库是最近才创建的,所有的操作都还保留在oplog里,所以用户通过oplog把所有误删的数据都找回了。通过 oplog 恢复数据的流程非常简单,只需要把oplog集合通过mongodump导出,然后通过mongorestore 的 oplogReplay  模式重放一下。Step1: 导出 oplog 集合mongodump -d local -c oplog.rs -d -o backupdirStep2: 拷贝oplog集合的数据mkdir new_backupdir  cp backupdir/local/oplog.rs.bson new_backupdir/oplog.bsonStep3: 重放oplogmongorestore --oplogReplay new_backupdir方法二:通过备份集恢复如果对 MongoDB 做了全量备份 + 增量备份,那么可以通过备份集及来恢复数据。备份可以是多种形式,比如:通过 mongodump 等工具,对数据库产生的逻辑备份拷贝 dbpath 目录产生的物理备份文件系统、卷管理等产生的快照等关于MongoDB中怎么恢复误删的数据库就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

RedHat中怎么移除MongoDB

2021/7/16 23:15:15

这期内容当中小编将会给大家带来有关RedHat中怎么移除MongoDB,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。由于MongoDB新的服务器端公共许可证(SSPL),Red Hat将不会在Red Hat Enterprise  Linux或Fedora中使用MongoDB。MongoDB这款开源文档NoSQL数据库摊上了问题。虽然大受欢迎,但这边厢AWS、IBM  Cloud、Scalegrid和ObjectRocket等云计算公司将MongoDB作为一项服务来提供,因此赚得钵满盆满;那边厢,MongoDB公司却迟迟未能将其变现,在市场上获得同样大的成功。MongoDB的答案是什么?让这款软件改而采用新的服务器端公共许可证(SSPL)。开源巨头Red  Hat的反应又是什么?从Red Hat Enterprise Linux(RHEL)8中删除MongoDB。Red Hat的技术和社区外联项目经理Tom Callaway在宣布从Fedora  Linux中删除MongoDB的声明中解释道:“Fedora认为SSPL是为了对特定类别的用户带有严重歧视而有意设计的。”Debian  Linux已经从其发行版中删除了MongoDB。具体来说反对意见是,如果你提供采用SSPL许可证的服务,SSPL要求你必须开源将该软件作为服务来提供所使用的所有程序。微软***执行官Steve  Ballmer曾发出过有名的警告,称Linux的GPL“是一种从知识产权角度来看依附在它所接触的一切事物上的毒瘤,”他说错了。但是SSPL明确试图这么做。MongoDB的***技术官兼联合创始人Eliot  Horowitz在开源倡议组织(OSI)围绕SSPL展开讨论时解释了这么做的道理:我们认为,在当今世界,连接已被程序作为服务来提供以及通过网络连接程序作为程序结合的主要形式所取代。目前不清楚现有的反版权(copyleft)许可证是否明确适用于这种形式的程序组合,我们打算让SSPL成为开发人员消除这种不确定性的一种选择。它没有奏效。Callaway继续说道:此外,很显然,许可证作者的意图是让采用许可证的软件的商业用户产生恐惧、不确定和怀疑(FUD)这种情绪。将SSPL视为“免费”或“开源”导致这个影子投射到了FOSS生态系统的所有其他许可证上,即使这些许可证中没有一个带来这种风险。此前,OSI拒绝宣布SSPL是开源许可证。拟议中的SSPLv2也在OSI停滞不前。MongoDB改变许可证背后的商业出发点是,迫使云计算公司使用MongoDB的商业云产品之一。这也没有奏效。AWS刚推出了DocumentDB,这款数据库“旨在与你现有的MongoDB应用程序和工具兼容”,AWS宣传官Jeff  Barr写道。“它与2017年11月推出的MongoDB版本3.6兼容(那时还没有采用SSPL),并且通过模拟MongoDB客户端预计来自MongoDB服务器的响应来实现MongoDB  3.6 API。”MongoDB对此并不满意。MongoDB的***执行官Dev  Ittycheria说:“模仿是最真诚的奉承,因此亚马逊试图利用MongoDB的受欢迎程度和发展势头坐享其成也就不足为奇了。但是开发人员聪明得很,辨别得了真正的创新和拙劣的模仿。”真是这样吗?MongoDB试图通过SSPL获取收入的做法似乎适得其反。现在唱反调的不光是云计算公司,连Linux供应商都没有给MongoDB好脸色看。正如EnterpriseDB的***系统工程师Devrim  G&uuml;nd&uuml;z所说:“我确实很明白MongoDB决定改用SSPL的原因。看到超级云服务提供商从流行开源项目赚到的钱比开发和维护这些项目的贡献者多得多,确实让人郁闷。”但是开源项目创建者之一Bruce  Perens说,没有人阻止“你使用任何许可证。只是别称之为开源。”上述就是小编为大家分享的RedHat中怎么移除MongoDB了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注辰讯云资讯频道。...

本篇内容主要讲解“linux中ftp命令参数的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中ftp命令参数的用法”吧!以下是linux中ftp命令参数的详解,希望对您有所帮助.FTP> ! 从 ftp 子系统退出到外壳。FTP> ? 显示 ftp 命令说明。? 和 help 相同。格式:? [command]说明:[command]指定需要帮助的命令名称。假如没有指定 command,linux中ftp命令参数将显示全部命令的列表。FTP> append 使用当前文档类型配置将本地文档附加到远程电脑上的文档。格式:append local-file [remote-file]说明:local-file 指定要添加的本地文档。remote-file 指定要添加 local-file 的远程电脑上的文档。假如省略了 remote-file,本地文档名将被用作远程文档名。FTP> ascii 将文档传送类型配置为默认的 ASCII。说明:linux中ftp命令参数支持两种文档传送类型,ASCII 码和二进制图像。在传送文本文档时应该使用ASCII。FTP> bell 转换响铃以在每个文档传送命令完成后响铃。默认情况下,铃声是关闭的。FTP> binary(或bi) 将文档传送类型配置为二进制。FTP> bye(或by) 结束和远程电脑的linux中ftp命令参数会话并退出linux中ftp命令参数。FTP> cd 更改远程电脑上的工作目录。格式:cd remote-directory说明:remote-directory 指定要更改的远程电脑上的目录。FTP> close 结束和远程服务器的linux中ftp命令参数会话并返回命令解释程式。FTP> debug 转换调试。当调试打开时,发送到远程电脑的每个命令都打印,前面是字符串“>”。默认情况下,调试是关闭的。FTP> delete 删除远程电脑上的文档。格式:delete remote-file说明:remote-file 指定要删除的文档。FTP> dir 显示远程目录文档和子目录列表。格式:dir [remote-directory] [local-file]说明:remote-directory 指定要查看其列表的目录。假如没有指定目录,将使用远程电脑中的当前工作目录。Local-file 指定要存储列表的本地文档。假如没有指定,输出将显示在屏幕上。FTP> disconnect 从远程电脑断开,保留linux中ftp命令参数提示。FTP> get 使用当前文档转换类型将远程文档复制到本地电脑。格式:get remote-file [local-file]说明:remote-file 指定要复制的远程文档。Local-file 指定要在本地电脑上使用的名称。假如没有指定,文档将命名为 remote-file。FTP >glob 转换文档名组合。组合允许在内部文档或路径名中使用通配符(*和?)。默认情况下,组合是打开的。FTP >hash 转换已传输的每个数据块的数字签名 (#) 打印。数据块的大小是2048 字节。默认情况下,散列符号打印是关闭的。FTP >help 显示linux中ftp命令参数命令说明。格式:help [command]说明:command 指定需要有关说明的命令的名称。假如没有指定 command,linux中ftp命令参数将显示全部命令的列表。FTP >lcd 更改本地电脑上的工作目录。默认情况下,工作目录是启动linux中ftp命令参数的目录。格式:lcd [directory]说明:directory 指定要更改的本地电脑上的目录。假如没有指定directory,将显示本地电脑中当前的工作目录。FTP >literal 将参数逐字发送到远程linux中ftp命令参数服务器。将返回单个的linux中ftp命令参数回复代码。格式:literal argument [ ...]说明:argument 指定要发送到linux中ftp命令参数服务器的参数。FTP >ls 显示远程目录文档和子目录的缩写列表。格式:ls [remote-directory] [local-file]说明:remote-directory 指定要查看其列表的目录。假如没有指定目录,将使用远程电脑中的当前工作目录。 local-file 指定要存储列表的本地文档。假如没有指定,输出将显示在屏幕上。FTP >mdelete 删除远程电脑上的文档。格式:mdelete remote-files [ ...]说明:remote-files 指定要删除的远程文档。FTP >mdir 显示远程目录文档和子目录列表。能够使用 mdir 指定多个文档。格式:mdir remote-files [ ...] local-file说明:remote-files 指定要查看列表的目录。必须指定 remote-files。请键入 - 使用远程电脑上的当前工作目录。local-file 指定要还原列表的本地文档。请键入- 在屏幕上显示列表。FTP >mget 使用当前文档传送类型将远程文档复制到本地电脑。格式:mget remote-files [ ...]说明:remote-files 指定要复制到本地电脑的远程文档。FTP >mkdir 创建远程目录。格式:mkdir directory说明:directory 指定新的远程目录的名称。FTP >mls 显示远程目录文档和子目录的缩写列表。格式:mls remote-files [ ...] local-file说明:remote-files 指定要查看列表的文档。必须指定 remote-files;请键入- 使用远程电脑上的当前工作目录。local-file 指定要存储列表的本地文档。请键入 - 以在屏幕上显示列表。FTP >mput 使用当前文档传送类型将本地文档复制到远程电脑上。格式:mput local-files [ ...]说明:local-files 指定要复制到远程电脑的本地文档FTP >open 和指定的linux中ftp命令参数服务器连接。格式:open computer [port]说明:computer 指定要连接的远程电脑。能够通过 IP 地址或电脑名称指定电脑(DNS 或主机文档必须可用)。假如自动登录打开(默认),ftp 还将尝试自动将用户登录到linux中ftp命令参数服务器port 指定用来联系linux中ftp命令参数服务器的端口号。FTP >prompt 转换提示。假如关闭提示时 mget 及 mput 传送任何文档,linux中ftp命令参数在多文档传送过程中将提示允许您有选择地检索或存储文档。默认情况下,提示是打开的。FTP >put 使用当前文档传送类型将本地文档复制到远程电脑上。格式:put local-file [remote-file]说明:local-file 指定要复制的本地文档。remote-file 指定要在远程电脑上使用的名称。假如没有指定,文档将命名为 local-file。FTP >pwd 显示远程电脑上的当前目录。FTP >quit 结束和远程电脑的linux中ftp命令参数会话并退出linux中ftp命令参数。FTP >quote 将参数逐字发送到远程linux中ftp命令参数服务器。将返回单个的linux中ftp命令参数回复代码。Quote 和 literal 相同。格式:quote argument [ ...]说明:argument 指定要发送到linux中ftp命令参数服务器的参数。FTP >recv 使用当前文档传送类型将远程文档复制到本地电脑。Recv 和 get相同。格式:recv remote-file [local-file]说明:remote-file 指定要复制的远程文档。local-file 指定要在本地电脑上使用的名称。假如没有指定,文档将命名为 remote-file。FTP >remotehelp 显示远程命令帮助。格式:remotehelp [command]说明:command 指定需要帮助的命令的名称。假如没有指定 command,linux中ftp命令参数将显示全部远程命令的列表。FTP >rename 重命名远程文档。格式:rename filename newfilename说明:filename 指定要重命名的文档。 newfilename 指定新的文档名。FTP >rmdir 删除远程目录。格式:rmdir directory说明:directory 指定要删除的远程目录的名称。FTP >send 使用当前文档传送类型将本地文档复制到远程电脑上。Send 和put 相同。格式:send local-file [remote-file]说明:local-file 指定要复制的本地文档。 remote-file 指定要在远程电脑上使用的名称。假如没有指定,文档将命名为 local-file。FTP >status 显示linux中ftp命令参数连接和转换的当前状态。FTP >trace 转换数据包跟踪。Trace 在运行linux中ftp命令参数命令时显示每个数据包的路由。FTP >type 配置或显示文档传送类型。格式:type [type-name]说明:type-name 指定文档传送类型。默认配置为 ascii。假如没有指定type-name,将显示当前的类型。FTP >user 指定远程电脑的用户。格式:user username [password] [account]说明:user-name 指定登录到远程电脑所使用的用户名。password 指定 user-name 的密码。假如没有指定,但必须指定,linux中ftp命令参数会提示输入密码。account 指定登录到远程电脑所使用的帐户。假如没有指定account,但是需要指定,linux中ftp命令参数会提示您输入帐户。FTP >verbose 转换 verbose 模式。假如打开,将显示任何 linux中ftp命令参数响应。在文档传送完成后,将同时显示和传送效率有关的统计信息。默认情况下,verbose 是打开的。到此,相信大家对“linux中ftp命令参数的用法”有了更深的了解,不妨来实际操作一番吧!这里是辰讯云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!...

asp.net中如何使用 log4net

2021/7/15 23:53:13

asp.net中如何使用 log4net,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先引入log4net.dll,关于这个文件自己百度下载下。         然后配置一下有关配置,在web.config中加入在configuration节点下<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="log/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%n%r %p[%d %c] %m%n" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="rollingFile" /> </root>   <logger name="WebLogger"> <level value="ALL" /> <appender-ref ref="rollingFile" /> </logger> </log4net>        然后在Global.asax的Application_Start方法中加入log4net.Config.XmlConfigurator.Configure();        最后写一个日志输出类,方便调用public class MyLog{   private static readonly log4net.ILog log = log4net.LogManager.GetLogger("WebLogger");    public MyLog() {    }  private static void SetConfig() {  object o = ConfigurationManager.GetSection("log4net");  log4net.Config.XmlConfigurator.Configure(o as System.Xml.XmlElement);  }    public static void LogInfo(string Message) {  if (!log.IsInfoEnabled)  SetConfig();  log.Info(Message);  }    public static void LogInfo(string Message, Exception ex) {  if (!log.IsInfoEnabled)  SetConfig();  log.Info(Message, ex);  }  public static void ErrorInfo(string Message) {  if (!log.IsInfoEnabled)  SetConfig();  log.Error(Message);  }    public static void DebugInfo(string Message) {  if (!log.IsInfoEnabled)  SetConfig();  log.Debug(Message);  } }关于asp.net中如何使用 log4net问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注辰讯云资讯频道了解更多相关知识。...